velocious 1.0.648 → 1.0.649

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 (53) hide show
  1. package/README.md +11 -0
  2. package/build/cli/commands/db/base-command.js +6 -4
  3. package/build/cli/commands/db/create.js +1 -1
  4. package/build/database/drivers/base.js +1 -0
  5. package/build/database/drivers/mssql/index.js +12 -4
  6. package/build/database/query/model-class-query.js +8 -1
  7. package/build/database/query/query-data.js +3 -4
  8. package/build/database/query/select-base.js +9 -0
  9. package/build/database/query/select-plain.js +24 -0
  10. package/build/database/query/where-model-class-hash.js +1 -1
  11. package/build/database/record/index.js +16 -5
  12. package/build/src/cli/commands/db/base-command.d.ts +4 -2
  13. package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
  14. package/build/src/cli/commands/db/base-command.js +7 -5
  15. package/build/src/cli/commands/db/create.js +2 -2
  16. package/build/src/database/drivers/base.d.ts +4 -0
  17. package/build/src/database/drivers/base.d.ts.map +1 -1
  18. package/build/src/database/drivers/base.js +2 -1
  19. package/build/src/database/drivers/mssql/index.d.ts +2 -1
  20. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  21. package/build/src/database/drivers/mssql/index.js +13 -5
  22. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  23. package/build/src/database/query/model-class-query.js +8 -2
  24. package/build/src/database/query/query-data.js +4 -5
  25. package/build/src/database/query/select-base.d.ts +8 -0
  26. package/build/src/database/query/select-base.d.ts.map +1 -1
  27. package/build/src/database/query/select-base.js +9 -1
  28. package/build/src/database/query/select-plain.d.ts +10 -0
  29. package/build/src/database/query/select-plain.d.ts.map +1 -1
  30. package/build/src/database/query/select-plain.js +21 -1
  31. package/build/src/database/query/where-model-class-hash.js +2 -2
  32. package/build/src/database/record/index.d.ts +14 -4
  33. package/build/src/database/record/index.d.ts.map +1 -1
  34. package/build/src/database/record/index.js +17 -6
  35. package/build/src/testing/shared-transaction-proxy-driver.d.ts.map +1 -1
  36. package/build/src/testing/shared-transaction-proxy-driver.js +7 -1
  37. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -1
  38. package/build/src/testing/velocious-suite-hook-executor.js +5 -2
  39. package/build/testing/shared-transaction-proxy-driver.js +6 -0
  40. package/build/testing/velocious-suite-hook-executor.js +4 -1
  41. package/package.json +1 -1
  42. package/src/cli/commands/db/base-command.js +6 -4
  43. package/src/cli/commands/db/create.js +1 -1
  44. package/src/database/drivers/base.js +1 -0
  45. package/src/database/drivers/mssql/index.js +12 -4
  46. package/src/database/query/model-class-query.js +8 -1
  47. package/src/database/query/query-data.js +3 -4
  48. package/src/database/query/select-base.js +9 -0
  49. package/src/database/query/select-plain.js +24 -0
  50. package/src/database/query/where-model-class-hash.js +1 -1
  51. package/src/database/record/index.js +16 -5
  52. package/src/testing/shared-transaction-proxy-driver.js +6 -0
  53. package/src/testing/velocious-suite-hook-executor.js +4 -1
@@ -123,9 +123,10 @@ export default class VelociousDatabaseDriversMssql extends Base {
123
123
  /**
124
124
  * Runs query actual.
125
125
  * @param {string} sql - SQL string.
126
+ * @param {import("../base.js").QueryOptions} [options] - Query options.
126
127
  * @returns {Promise<import("../base.js").QueryResultType>} - Resolves with the query actual.
127
128
  */
128
- _queryActual(sql: string): Promise<import("../base.js").QueryResultType>;
129
+ _queryActual(sql: string, options?: import("../base.js").QueryOptions): Promise<import("../base.js").QueryResultType>;
129
130
  /**
130
131
  * Executes a mutation with affected-row metadata.
131
132
  * @param {string} sql - Mutation SQL.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mssql/index.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mssql/index.js"],"names":[],"mappings":"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"}
@@ -279,17 +279,25 @@ export default class VelociousDatabaseDriversMssql extends Base {
279
279
  /**
280
280
  * Runs query actual.
281
281
  * @param {string} sql - SQL string.
282
+ * @param {import("../base.js").QueryOptions} [options] - Query options.
282
283
  * @returns {Promise<import("../base.js").QueryResultType>} - Resolves with the query actual.
283
284
  */
284
- async _queryActual(sql) {
285
+ async _queryActual(sql, options = {}) {
285
286
  let result;
286
287
  let tries = 0;
287
288
  while (true) {
288
289
  tries++;
289
290
  try {
290
- const request = this._currentTransaction
291
- ? new mssql.Request(this._currentTransaction)
292
- : new mssql.Request(this.connection);
291
+ const requestOptions = options.requestTimeoutMs === undefined
292
+ ? undefined
293
+ : { requestTimeout: options.requestTimeoutMs };
294
+ // node-mssql supports request-local overrides, but its DefinitelyTyped
295
+ // constructor declaration still exposes only the legacy first argument.
296
+ const request = requestOptions
297
+ ? Reflect.construct(mssql.Request, [this._currentTransaction || this.connection, requestOptions])
298
+ : this._currentTransaction
299
+ ? new mssql.Request(this._currentTransaction)
300
+ : new mssql.Request(this.connection);
293
301
  result = await request.query(sql);
294
302
  break;
295
303
  }
@@ -773,4 +781,4 @@ export default class VelociousDatabaseDriversMssql extends Base {
773
781
  return testResult === 0;
774
782
  }
775
783
  }
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9tc3NxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFDNUMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sNkJBQTZC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QyxDQUFDLENBQUMsRUFBRSw0QkFBNEIsQ0FBQTtRQUN4RCxNQUFNLFVBQVUsR0FBRyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQTtRQUUvRixJQUFJLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUUzQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQTtRQUVwRSxPQUFPLFVBQVUsS0FBSyxDQUFDLENBQUE7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBBbHRlclRhYmxlIGZyb20gXCIuL3NxbC9hbHRlci10YWJsZS5qc1wiXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi4vYmFzZS5qc1wiXG5pbXBvcnQgQ3JlYXRlRGF0YWJhc2UgZnJvbSBcIi4vc3FsL2NyZWF0ZS1kYXRhYmFzZS5qc1wiXG5pbXBvcnQgQ3JlYXRlSW5kZXggZnJvbSBcIi4vc3FsL2NyZWF0ZS1pbmRleC5qc1wiXG5pbXBvcnQgQ3JlYXRlVGFibGUgZnJvbSBcIi4vc3FsL2NyZWF0ZS10YWJsZS5qc1wiXG5pbXBvcnQgRGVsZXRlIGZyb20gXCIuL3NxbC9kZWxldGUuanNcIlxuaW1wb3J0IERyb3BEYXRhYmFzZSBmcm9tIFwiLi9zcWwvZHJvcC1kYXRhYmFzZS5qc1wiXG5pbXBvcnQgRHJvcFRhYmxlIGZyb20gXCIuL3NxbC9kcm9wLXRhYmxlLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgZXNjYXBlU3RyaW5nIGZyb20gXCJzcWwtZXNjYXBlLXN0cmluZ1wiXG5pbXBvcnQgSW5zZXJ0IGZyb20gXCIuL3NxbC9pbnNlcnQuanNcIlxuaW1wb3J0IE9wdGlvbnMgZnJvbSBcIi4vb3B0aW9ucy5qc1wiXG5pbXBvcnQgbXNzcWwgZnJvbSBcIm1zc3FsXCJcbmltcG9ydCBuZXQgZnJvbSBcIm5vZGU6bmV0XCJcbmltcG9ydCBRdWVyeVBhcnNlciBmcm9tIFwiLi9xdWVyeS1wYXJzZXIuanNcIlxuaW1wb3J0IFJlbW92ZUluZGV4IGZyb20gXCIuL3NxbC9yZW1vdmUtaW5kZXguanNcIlxuaW1wb3J0IFRhYmxlIGZyb20gXCIuL3RhYmxlLmpzXCJcbmltcG9ydCBTdHJ1Y3R1cmVTcWwgZnJvbSBcIi4vc3RydWN0dXJlLXNxbC5qc1wiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgVXBzZXJ0IGZyb20gXCIuL3NxbC91cHNlcnQuanNcIlxuaW1wb3J0IFVwZGF0ZSBmcm9tIFwiLi9zcWwvdXBkYXRlLmpzXCJcbmltcG9ydCBVVUlEIGZyb20gXCJwdXJlLXV1aWRcIlxuXG4vKipcbiAqIFNRTCBTZXJ2ZXIgZXJyb3IgbnVtYmVyIHJhaXNlZCBieSBgc3BfcmVsZWFzZWFwcGxvY2tgIHdoZW4gdGhlIGN1cnJlbnRcbiAqIHNlc3Npb24gZG9lcyBub3QgaG9sZCB0aGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uIGxvY2suIFJlbGVhc2luZyBhIGxvY2sgdGhlXG4gKiBzZXNzaW9uIG5vIGxvbmdlciBob2xkcyBpcyBhIG5vcm1hbCByYWNlIChhIHNoYXJlZCBjb25uZWN0aW9uJ3MgZmluYWxcbiAqIGNoZWNrLWluIG1heSBhbHJlYWR5IGhhdmUgYXV0by1yZWxlYXNlZCBpdCksIHdoaWNoIHRoZSBjcm9zcy1kcml2ZXJcbiAqIGByZWxlYXNlQWR2aXNvcnlMb2NrYCBjb250cmFjdCBtb2RlbHMgYnkgcmVzb2x2aW5nIHRvIGBmYWxzZWAuIFdlIHRyYW5zbGF0ZVxuICogdGhpcyBzcGVjaWZpYyBlcnJvciBpbnRvIHRoYXQgcmVzdWx0IHJhdGhlciB0aGFuIGxldHRpbmcgaXQgZXNjYXBlLlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgQVBQTE9DS19OT1RfSEVMRF9FUlJPUl9OVU1CRVIgPSAxMjIzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc01zc3FsIGV4dGVuZHMgQmFzZXtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJtc3NxbFwiKS5UcmFuc2FjdGlvbiB8IG51bGx9ICovXG4gIF9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbiA9IG51bGxcblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldEFyZ3MoKVxuICAgIGNvbnN0IHNxbENvbmZpZyA9IGRpZ2coYXJncywgXCJzcWxDb25maWdcIilcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSBhd2FpdCB0aGlzLmNsb3NlKClcblxuICAgICAgaWYgKHNxbENvbmZpZykge1xuICAgICAgICBzcWxDb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNxbENvbmZpZy5vcHRpb25zLCB7dXNlVVRDOiB0cnVlfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHNxbENvbmZpZz8uc2VydmVyICYmICFzcWxDb25maWcub3B0aW9ucz8uc2VydmVyTmFtZSAmJiBuZXQuaXNJUChzcWxDb25maWcuc2VydmVyKSkge1xuICAgICAgICBzcWxDb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNxbENvbmZpZy5vcHRpb25zLCB7c2VydmVyTmFtZTogXCJcIn0pXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBtc3NxbC5Db25uZWN0aW9uUG9vbChzcWxDb25maWcpXG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uY29ubmVjdCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlLXRocm93IHRvIGZpeCB1bnVzZWFibGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGNvbm5lY3QgdG8gZGF0YWJhc2U6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBfY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICB0aGlzLl90cmFuc2FjdGlvbnNDb3VudCA9IDBcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBzZXNzaW9uRXJyb3JcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2Vzc2lvbkVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNsb3NlIE1TU1FMIGFkdmlzb3J5LWxvY2sgc2Vzc2lvblwiLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMjAwMH0sICgpID0+IGNvbm5lY3Rpb24uY2xvc2UoKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBjbG9zZSBNU1NRTCBjb25uZWN0aW9uIGNsZWFubHlcIiwge2Vycm9yfSlcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbkVycm9yKSB0aHJvdyBzZXNzaW9uRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsdGVyIHRhYmxlIHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiKS5kZWZhdWx0fSB0YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSkge1xuICAgIGNvbnN0IGFsdGVyQXJncyA9IHt0YWJsZURhdGEsIGRyaXZlcjogdGhpc31cbiAgICBjb25zdCBhbHRlclRhYmxlID0gbmV3IEFsdGVyVGFibGUoYWx0ZXJBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGFsdGVyVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSBkYXRhYmFzZSBzcWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBEYXRhYmFzZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaWZOb3RFeGlzdHNdIC0gV2hldGhlciBpZiBub3QgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBjcmVhdGVEYXRhYmFzZVNxbChkYXRhYmFzZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZGF0YWJhc2VOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGNyZWF0ZURhdGFiYXNlID0gbmV3IENyZWF0ZURhdGFiYXNlKGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gY3JlYXRlRGF0YWJhc2UudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCBkYXRhYmFzZSBzcWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBEYXRhYmFzZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaWZFeGlzdHNdIC0gV2hldGhlciBpZiBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGRyb3BEYXRhYmFzZVNxbChkYXRhYmFzZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCBkcm9wQXJncyA9IE9iamVjdC5hc3NpZ24oe2RhdGFiYXNlTmFtZSwgZHJpdmVyOiB0aGlzfSwgYXJncylcbiAgICBjb25zdCBkcm9wRGF0YWJhc2UgPSBuZXcgRHJvcERhdGFiYXNlKGRyb3BBcmdzKVxuXG4gICAgcmV0dXJuIGRyb3BEYXRhYmFzZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgaW5kZXggc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkNyZWF0ZUluZGV4U3FsQXJnc30gaW5kZXhEYXRhIC0gSW5kZXggZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleFNRTHMoaW5kZXhEYXRhKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGluZGV4RGF0YSlcbiAgICBjb25zdCBjcmVhdGVJbmRleCA9IG5ldyBDcmVhdGVJbmRleChjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUluZGV4LnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXggc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlJlbW92ZUluZGV4U3FsQXJnc30gaW5kZXhEYXRhIC0gSW5kZXggZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyByZW1vdmVJbmRleFNRTHMoaW5kZXhEYXRhKSB7XG4gICAgY29uc3QgcmVtb3ZlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGluZGV4RGF0YSlcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IG5ldyBSZW1vdmVJbmRleChyZW1vdmVBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlbW92ZUluZGV4LnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3RhYmxlLWRhdGEvaW5kZXguanNcIikuZGVmYXVsdH0gdGFibGVEYXRhIC0gVGFibGUgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZVNxbCh0YWJsZURhdGEpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0ge3RhYmxlRGF0YSwgZHJpdmVyOiB0aGlzLCBpbmRleEluQ3JlYXRlVGFibGU6IGZhbHNlfVxuICAgIGNvbnN0IGNyZWF0ZVRhYmxlID0gbmV3IENyZWF0ZVRhYmxlKGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlVGFibGUudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3VycmVudCBkYXRhYmFzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGRhdGFiYXNlLlxuICAgKi9cbiAgYXN5bmMgY3VycmVudERhdGFiYXNlKCkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIERCX05BTUUoKSBBUyBkYl9uYW1lXCIpXG5cbiAgICByZXR1cm4gZGlnZyhyb3dzLCAwLCBcImRiX25hbWVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBldmVyeSBmb3JlaWduIGtleSBjb25zdHJhaW50IChidWxrIGBOT0NIRUNLYCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZm9yZWlnbiBrZXlzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIGFzeW5jIGRpc2FibGVGb3JlaWduS2V5cygpIHtcbiAgICBhd2FpdCB0aGlzLl9leGVjQ29uc3RyYWludFRvZ2dsZShcIkVYRUMgc3BfTVNmb3JlYWNodGFibGUgXFxcIkFMVEVSIFRBQkxFID8gTk9DSEVDSyBDT05TVFJBSU5UIGFsbFxcXCJcIiwgXCJkaXNhYmxlRm9yZWlnbktleXNcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1lbmFibGVzIGFuZCByZS12YWxpZGF0ZXMgZXZlcnkgZm9yZWlnbiBrZXkgY29uc3RyYWludCAoYFdJVEggQ0hFQ0tgKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBmb3JlaWduIGtleXMgYXJlIGVuYWJsZWQuXG4gICAqL1xuICBhc3luYyBlbmFibGVGb3JlaWduS2V5cygpIHtcbiAgICBhd2FpdCB0aGlzLl9leGVjQ29uc3RyYWludFRvZ2dsZShcIkVYRUMgc3BfTVNmb3JlYWNodGFibGUgQGNvbW1hbmQxPVxcXCJwcmludCAnPydcXFwiLCBAY29tbWFuZDI9XFxcIkFMVEVSIFRBQkxFID8gV0lUSCBDSEVDSyBDSEVDSyBDT05TVFJBSU5UIGFsbFxcXCJcIiwgXCJlbmFibGVGb3JlaWduS2V5c1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIGNvbnN0cmFpbnQtdG9nZ2xlIHN0YXRlbWVudC4gYEFMVEVSIFRBQkxFIC4uLiBOT0NIRUNLL0NIRUNLXG4gICAqIENPTlNUUkFJTlRgIG5lZWRzIGEgc2NoZW1hLW1vZGlmaWNhdGlvbiBsb2NrIG9uIGV2ZXJ5IHRhYmxlLCBzbyBpZiB0aGVcbiAgICogcmVxdWVzdCB0aW1lcyBvdXQgaXQgaXMgYWxtb3N0IGFsd2F5cyBibG9ja2VkIGJ5IGFub3RoZXIgc2Vzc2lvbiB0aGF0IGlzXG4gICAqIHN0aWxsIGhvbGRpbmcgYSBsb2NrIChhIGxlYWtlZC91bmNvbW1pdHRlZCBjb25uZWN0aW9uKS4gT24gYSB0aW1lb3V0LFxuICAgKiBjYXB0dXJlIHdoaWNoIHNlc3Npb25zIHdlcmUgYmxvY2tpbmcgc28gdGhlIHJlYWwgY3VscHJpdCBpcyBuYW1lZCBpbnN0ZWFkXG4gICAqIG9mIGxlYXZpbmcgYSBiYXJlIFwiUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUgaW4gMTUwMDBtc1wiLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gQ29uc3RyYWludC10b2dnbGUgU1FMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBPcGVyYXRpb24gbGFiZWwgZm9yIHRoZSBlcnJvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgdG9nZ2xlIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF9leGVjQ29uc3RyYWludFRvZ2dsZShzcWwsIGxhYmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAvVGltZW91dDogUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUvaS50ZXN0KGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5fY2FwdHVyZUJsb2NraW5nU2Vzc2lvbnNGb3JEZWJ1ZygpLmNhdGNoKFxuICAgICAgICAgIChkaWFnRXJyb3IpID0+IGAoYmxvY2tpbmcgZGlhZ25vc3RpY3MgcXVlcnkgZmFpbGVkOiAke2RpYWdFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZGlhZ0Vycm9yLm1lc3NhZ2UgOiBkaWFnRXJyb3J9KWBcbiAgICAgICAgKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvci5tZXNzYWdlfVxcblxcblske2xhYmVsfSBibG9ja2VkXSBvdGhlciB1c2VyIHNlc3Npb25zIHdpdGggb3BlbiB0cmFuc2FjdGlvbnMgb3IgYWN0aXZlIHJlcXVlc3RzOlxcbiR7c25hcHNob3R9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90cyB0aGUgc2Vzc2lvbnMgdGhhdCBjb3VsZCBiZSBibG9ja2luZyBhIGNvbnN0cmFpbnQgdG9nZ2xlIGluIFRISVNcbiAgICogZGF0YWJhc2Ug4oCUIGV2ZXJ5IHNlc3Npb24gb3RoZXIgdGhhbiB0aGlzIG9uZSB0aGF0IGhvbGRzIGEgbG9jayBpbiBgREJfSUQoKWBcbiAgICogb3IgaXMgcnVubmluZyBhIHJlcXVlc3QgYWdhaW5zdCBpdCDigJQgd2l0aCBpdHMgbGFzdCBzdGF0ZW1lbnQsIHdhaXQgc3RhdGUsXG4gICAqIGFuZCBibG9ja2luZyBzZXNzaW9uLCBlbm91Z2ggdG8gaWRlbnRpZnkgYSBjb25uZWN0aW9uIHRoYXQgbGVha2VkIGEgbG9jay5cbiAgICogU2NvcGVkIHRvIHRoZSBjdXJyZW50IGRhdGFiYXNlIHNvIGEgbXVsdGktZGF0YWJhc2Ugc2VydmVyIGRvZXMgbm90IGxlYWtcbiAgICogdW5yZWxhdGVkIHNlc3Npb25zJyBTUUwgaW50byB0aGUgZXJyb3IgYW5kIGJ1cnkgdGhlIHJlYWwgYmxvY2tlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKU09OIHNuYXBzaG90LCBvciBhIFwiKG5vbmUpXCIgbWFya2VyLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVCbG9ja2luZ1Nlc3Npb25zRm9yRGVidWcoKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoYFxuICAgICAgV0lUSCBsb2NrX3Nlc3Npb25zIEFTIChcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIHJlcXVlc3Rfc2Vzc2lvbl9pZCBBUyBzZXNzaW9uX2lkXG4gICAgICAgIEZST00gc3lzLmRtX3RyYW5fbG9ja3NcbiAgICAgICAgV0hFUkUgcmVzb3VyY2VfZGF0YWJhc2VfaWQgPSBEQl9JRCgpXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgcy5zZXNzaW9uX2lkIEFTIHNlc3Npb25JZCxcbiAgICAgICAgcy5zdGF0dXMgQVMgc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgcy5sb2dpbl90aW1lIEFTIGxvZ2luVGltZSxcbiAgICAgICAgcy5sYXN0X3JlcXVlc3Rfc3RhcnRfdGltZSBBUyBsYXN0UmVxdWVzdFN0YXJ0LFxuICAgICAgICBzLmxhc3RfcmVxdWVzdF9lbmRfdGltZSBBUyBsYXN0UmVxdWVzdEVuZCxcbiAgICAgICAgcy5vcGVuX3RyYW5zYWN0aW9uX2NvdW50IEFTIG9wZW5UcmFuc2FjdGlvbkNvdW50LFxuICAgICAgICByLnN0YXR1cyBBUyByZXF1ZXN0U3RhdHVzLFxuICAgICAgICByLmNvbW1hbmQgQVMgY29tbWFuZCxcbiAgICAgICAgci53YWl0X3R5cGUgQVMgd2FpdFR5cGUsXG4gICAgICAgIHIud2FpdF90aW1lIEFTIHdhaXRUaW1lTXMsXG4gICAgICAgIHIuYmxvY2tpbmdfc2Vzc2lvbl9pZCBBUyBibG9ja2luZ1Nlc3Npb25JZCxcbiAgICAgICAgQ0FTVChpYi5ldmVudF9pbmZvIEFTIE5WQVJDSEFSKE1BWCkpIEFTIGxhc3RTcWxcbiAgICAgIEZST00gc3lzLmRtX2V4ZWNfc2Vzc2lvbnMgc1xuICAgICAgTEVGVCBKT0lOIHN5cy5kbV9leGVjX3JlcXVlc3RzIHIgT04gci5zZXNzaW9uX2lkID0gcy5zZXNzaW9uX2lkXG4gICAgICBPVVRFUiBBUFBMWSBzeXMuZG1fZXhlY19pbnB1dF9idWZmZXIocy5zZXNzaW9uX2lkLCBOVUxMKSBpYlxuICAgICAgV0hFUkUgcy5pc191c2VyX3Byb2Nlc3MgPSAxXG4gICAgICAgIEFORCBzLnNlc3Npb25faWQgPD4gQEBTUElEXG4gICAgICAgIEFORCAocy5zZXNzaW9uX2lkIElOIChTRUxFQ1Qgc2Vzc2lvbl9pZCBGUk9NIGxvY2tfc2Vzc2lvbnMpIE9SIHIuZGF0YWJhc2VfaWQgPSBEQl9JRCgpKVxuICAgIGApXG5cbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBcIihub25lIOKAlCBubyBvdGhlciBzZXNzaW9uIGhlbGQgYSBsb2NrIG9yIHJhbiBhIHJlcXVlc3QgaW4gdGhpcyBkYXRhYmFzZSB3aGVuIHF1ZXJpZWQpXCJcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyb3dzLCBudWxsLCAyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHt0YWJsZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgZHJvcFRhYmxlID0gbmV3IERyb3BUYWJsZShkcm9wQXJncylcblxuICAgIHJldHVybiBhd2FpdCBkcm9wVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgdGhhdCByZWZlcmVuY2UgdGhlIGdpdmVuIHRhYmxlLiBNU1NRTFxuICAgKiByZWZ1c2VzIHRvIGRyb3AgYSB0YWJsZSB0aGF0IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgYSBGT1JFSUdOIEtFWVxuICAgKiBjb25zdHJhaW50IGV2ZW4gd2hlbiBjb25zdHJhaW50cyBhcmUgZGlzYWJsZWQgdmlhIE5PQ0hFQ0ssIHNvIHRoZVxuICAgKiByZWZlcmVuY2luZyBjb25zdHJhaW50cyBtdXN0IGJlIHJlbW92ZWQgYmVmb3JlIHRoZSB0YWJsZSBjYW4gYmUgZHJvcHBlZC5cbiAgICogVGhpcyBsZXRzIGNhbGxlcnMgZHJvcCB0YWJsZXMgaW4gYW55IG9yZGVyIChlLmcuIHdpcGluZyBhIHdob2xlIHNjaGVtYSlcbiAgICogd2l0aG91dCBmaXJzdCBkcm9wcGluZyBldmVyeSBkZXBlbmRlbnQgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Ryb3BSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgXCJTRUxFQ1QgZmsubmFtZSBBUyBjb25zdHJhaW50X25hbWUsIE9CSkVDVF9OQU1FKGZrLnBhcmVudF9vYmplY3RfaWQpIEFTIHBhcmVudF90YWJsZSBcIiArXG4gICAgICBgRlJPTSBzeXMuZm9yZWlnbl9rZXlzIGZrIFdIRVJFIGZrLnJlZmVyZW5jZWRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKCR7dGhpcy5xdW90ZSh0YWJsZU5hbWUpfSlgXG4gICAgKVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgY29uc3RyYWludE5hbWUgPSByb3cuY29uc3RyYWludF9uYW1lID8/IHJvdy5DT05TVFJBSU5UX05BTUVcbiAgICAgIGNvbnN0IHBhcmVudFRhYmxlID0gcm93LnBhcmVudF90YWJsZSA/PyByb3cuUEFSRU5UX1RBQkxFXG5cbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoYEFMVEVSIFRBQkxFIFske3BhcmVudFRhYmxlfV0gRFJPUCBDT05TVFJBSU5UIFske2NvbnN0cmFpbnROYW1lfV1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRHJvcFRhYmxlU3FsQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90UmVhZE9ubHkoKVxuICAgIGF3YWl0IHRoaXMuX2Ryb3BSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKHRhYmxlTmFtZSlcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmRyb3BUYWJsZVNRTHModGFibGVOYW1lLCBhcmdzKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHR5cGUuXG4gICAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gXCJtc3NxbFwiIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBhY3R1YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcXVlcnkgYWN0dWFsLlxuICAgKi9cbiAgYXN5bmMgX3F1ZXJ5QWN0dWFsKHNxbCkge1xuICAgIGxldCByZXN1bHRcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uXG4gICAgICAgICAgPyBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICAgICAgOiBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QucXVlcnkoc3FsKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA9PSBcIk5vIGNvbm5lY3Rpb24gaXMgc3BlY2lmaWVkIGZvciB0aGF0IHJlcXVlc3QuXCIgJiYgdHJpZXMgPD0gMykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNvbm5lY3RpbmcgdG8gZGF0YWJhc2VcIilcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29ubmVjdCgpXG4gICAgICAgICAgLy8gUmV0cnlcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgLy8gUmUtdGhyb3cgZXJyb3IgYmVjYXVzZSB0aGUgc3RhY2stdHJhY2UgaXMgYnJva2VuIGFuZCBjYW4ndCBiZSB1c2VkIGZvciBhcHAtZGV2ZWxvcG1lbnQuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgJyR7ZXJyb3IubWVzc2FnZX0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvcn0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3VsdC5yZWNvcmRzZXRzKSA/IHJlc3VsdC5yZWNvcmRzZXRzWzBdIHx8IFtdIDogW11cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIG11dGF0aW9uIHdpdGggYWZmZWN0ZWQtcm93IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gTXV0YXRpb24gU1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIEFmZmVjdGVkIHJvdyBjb3VudC5cbiAgICovXG4gIGFzeW5jIF9hZmZlY3RlZFJvd3NBY3R1YWwoc3FsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvblxuICAgICAgPyBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICA6IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuY29ubmVjdGlvbilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NBZmZlY3RlZC5yZWR1Y2UoKHRvdGFsLCBjb3VudCkgPT4gdG90YWwgKyBjb3VudCwgMClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IHRvIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9pbmRleC5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBxdWVyeVRvU3FsKHF1ZXJ5KSB7IHJldHVybiBuZXcgUXVlcnlQYXJzZXIoe3F1ZXJ5fSkudG9TcWwoKSB9XG5cbiAgc2hvdWxkU2V0QXV0b0luY3JlbWVudFdoZW5QcmltYXJ5S2V5KCkgeyByZXR1cm4gdHJ1ZSB9XG4gIHN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEKCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gZXhwbGljaXQgcHJpbWFyeS1rZXkgaW5zZXJ0IGFzIG9uZSBiYXRjaCByZXF1ZXN0OiBTUUwgU2VydmVyIHNjb3Blc1xuICAgKiBJREVOVElUWV9JTlNFUlQgdG8gdGhlIHNlc3Npb24sIGFuZCBub2RlLW1zc3FsIHBvb2wtYmFja2VkIHJlcXVlc3RzIG1heSB1c2VcbiAgICogYSBkaWZmZXJlbnQgcGh5c2ljYWwgc2Vzc2lvbiBwZXIgcXVlcnksIHNvIGVuYWJsaW5nIGl0IGluIGEgc2VwYXJhdGUgcXVlcnlcbiAgICogY2FuIGxlYXZlIHRoZSBhY3R1YWwgSU5TRVJUIG9uIGFub3RoZXIgc2Vzc2lvbi4gQSBzaW5nbGUgYmF0Y2gga2VlcHMgdGhlXG4gICAqIHdob2xlIHNlcXVlbmNlIG9uIG9uZSBzZXNzaW9uIGJ5IGNvbnN0cnVjdGlvbjogZW5hYmxlLCBpbnNlcnQsIGRpc2FibGUgb25cbiAgICogc3VjY2VzcywgYW5kIGEgQ0FUQ0ggdGhhdCBkaXNhYmxlcyBhbmQgcmV0aHJvd3MgdGhlIG9yaWdpbmFsIGVycm9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBhcmdzLm9wdGlvbnMgLSBRdWVyeSBvcHRpb25zIGZvciB0aGUgc3RhbmRhcmQgcXVlcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3FsIC0gR2VuZXJhdGVkIGluc2VydCBTUUwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFRhYmxlIGJlaW5nIGluc2VydGVkIGludG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBJbnNlcnQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0V2l0aEV4cGxpY2l0UHJpbWFyeUtleSh7b3B0aW9ucywgc3FsLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgcXVvdGVkVGFibGUgPSB0aGlzLnF1b3RlVGFibGUodGFibGVOYW1lKVxuICAgIGNvbnN0IGJhdGNoID0gW1xuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT047YCxcbiAgICAgIFwiQkVHSU4gVFJZXCIsXG4gICAgICBgJHtzcWx9O2AsXG4gICAgICBgU0VUIElERU5USVRZX0lOU0VSVCAke3F1b3RlZFRhYmxlfSBPRkY7YCxcbiAgICAgIFwiRU5EIFRSWVwiLFxuICAgICAgXCJCRUdJTiBDQVRDSFwiLFxuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT0ZGO2AsXG4gICAgICBcIlRIUk9XO1wiLFxuICAgICAgXCJFTkQgQ0FUQ0hcIlxuICAgIF0uam9pbihcIlxcblwiKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoYmF0Y2gsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlc2NhcGUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBlc2NhcGUuXG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSlcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiBgJHt2YWx1ZX1gXG5cbiAgICBjb25zdCByZXN1bHRXaXRoUXVvdGVzID0gZXNjYXBlU3RyaW5nKHN0cmluZ1ZhbHVlLCBudWxsKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFdpdGhRdW90ZXMuc3Vic3RyaW5nKDEsIHJlc3VsdFdpdGhRdW90ZXMubGVuZ3RoIC0gMSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1b3RlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gLSBUaGUgcXVvdGVkIHZhbHVlLlxuICAgKi9cbiAgcXVvdGUodmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSlcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKVxuXG4gICAgcmV0dXJuIGBOJHtlc2NhcGVTdHJpbmcoc3RyaW5nVmFsdWUsIG51bGwpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1b3RlIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcXVvdGUgY29sdW1uLlxuICAgKi9cbiAgcXVvdGVDb2x1bW4oY29sdW1uTmFtZSkgeyByZXR1cm4gdGhpcy5vcHRpb25zKCkucXVvdGVDb2x1bW5OYW1lKGNvbHVtbk5hbWUpIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFN0cmluZy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcXVvdGUgdGFibGUuXG4gICAqL1xuICBxdW90ZVRhYmxlKHN0cmluZykgeyByZXR1cm4gdGhpcy5vcHRpb25zKCkucXVvdGVUYWJsZU5hbWUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVuYW1lIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDb2x1bW5OYW1lIC0gUHJldmlvdXMgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDb2x1bW5OYW1lIC0gTmV3IGNvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoYEVYRUMgc3BfcmVuYW1lICR7dGhpcy5xdW90ZShgJHt0YWJsZU5hbWV9LiR7b2xkQ29sdW1uTmFtZX1gKX0sICR7dGhpcy5xdW90ZShuZXdDb2x1bW5OYW1lKX0sICdDT0xVTU4nYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGV0ZSBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5EZWxldGVTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBkZWxldGVTcWwoe3RhYmxlTmFtZSwgY29uZGl0aW9uc30pIHtcbiAgICBjb25zdCBkZWxldGVJbnN0cnVjdGlvbiA9IG5ldyBEZWxldGUoe2NvbmRpdGlvbnMsIGRyaXZlcjogdGhpcywgdGFibGVOYW1lfSlcblxuICAgIHJldHVybiBkZWxldGVJbnN0cnVjdGlvbi50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbnNlcnQgc3FsLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkluc2VydFNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIGluc2VydFNxbChhcmdzKSB7XG4gICAgY29uc3QgaW5zZXJ0QXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgaW5zZXJ0ID0gbmV3IEluc2VydChpbnNlcnRBcmdzKVxuXG4gICAgcmV0dXJuIGluc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdGFibGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB0YWJsZXMuXG4gICAqL1xuICBhc3luYyBnZXRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NhY2hlZFNjaGVtYU1ldGFkYXRhKFwidGFibGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0QXJncygpPy5zY2hlbWEgfHwgdGhpcy5nZXRBcmdzKCk/LnNxbENvbmZpZz8ub3B0aW9ucz8uc2NoZW1hXG4gICAgICBjb25zdCBzY2hlbWFDbGF1c2UgPSBzY2hlbWFcbiAgICAgICAgPyBgIEFORCBbVEFCTEVfU0NIRU1BXSA9ICR7dGhpcy5xdW90ZShzY2hlbWEpfWBcbiAgICAgICAgOiBcIiBBTkQgW1RBQkxFX1NDSEVNQV0gPSBTQ0hFTUFfTkFNRSgpXCJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoYFNFTEVDVCBbVEFCTEVfTkFNRV0gRlJPTSBbSU5GT1JNQVRJT05fU0NIRU1BXS5bVEFCTEVTXSBXSEVSRSBbVEFCTEVfQ0FUQUxPR10gPSBEQl9OQU1FKCkke3NjaGVtYUNsYXVzZX1gKVxuICAgICAgY29uc3QgdGFibGVzID0gW11cblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKHJvdykpXG5cbiAgICAgICAgdGFibGVzLnB1c2godGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZXNcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBhbGwgZWxpZ2libGUgdGFibGVzIGluIG9uZSBTUUwgU2VydmVyIHJlcXVlc3QsIHJldGFpbmluZyB0aGVcbiAgICogcmVjb2duaXplZCBmb3JlaWduLWtleSBmYWxsYmFjayB1c2VkIGJ5IHRoZSBwZXItdGFibGUgaW1wbGVtZW50YXRpb24uXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pn0gdGFibGVzIC0gRWxpZ2libGUgdGFibGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBiYXRjaCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyB0cnVuY2F0ZVRhYmxlcyh0YWJsZXMpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW11cblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBjb25zdCBxdW90ZWRUYWJsZSA9IHRoaXMucXVvdGVUYWJsZSh0YWJsZS5nZXROYW1lKCkpXG5cbiAgICAgIHN0YXRlbWVudHMucHVzaChcbiAgICAgICAgXCJCRUdJTiBUUllcIixcbiAgICAgICAgYCAgVFJVTkNBVEUgVEFCTEUgJHtxdW90ZWRUYWJsZX07YCxcbiAgICAgICAgXCJFTkQgVFJZXCIsXG4gICAgICAgIFwiQkVHSU4gQ0FUQ0hcIixcbiAgICAgICAgXCIgIElGIEVSUk9SX05VTUJFUigpID0gNDcxMlwiLFxuICAgICAgICBcIiAgQkVHSU5cIixcbiAgICAgICAgYCAgICBERUxFVEUgRlJPTSAke3F1b3RlZFRhYmxlfTtgLFxuICAgICAgICBcIiAgRU5EXCIsXG4gICAgICAgIFwiICBFTFNFXCIsXG4gICAgICAgIFwiICBCRUdJTlwiLFxuICAgICAgICBcIiAgICBUSFJPVztcIixcbiAgICAgICAgXCIgIEVORFwiLFxuICAgICAgICBcIkVORCBDQVRDSDtcIlxuICAgICAgKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucXVlcnkoc3RhdGVtZW50cy5qb2luKFwiXFxuXCIpKVxuICB9XG5cbiAgYXN5bmMgbGFzdEluc2VydElEKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgU0NPUEVfSURFTlRJVFkoKSBBUyBsYXN0X2luc2VydF9pZFwiLCBvcHRpb25zKVxuICAgIGNvbnN0IGxhc3RJbnNlcnRJRCA9IGRpZ2cocmVzdWx0LCAwLCBcImxhc3RfaW5zZXJ0X2lkXCIpXG5cbiAgICBpZiAobGFzdEluc2VydElEID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBnZXQgdGhlIGxhc3QgaW5zZXJ0ZWQgSURcIilcblxuICAgIHJldHVybiBsYXN0SW5zZXJ0SURcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtPcHRpb25zfSAtIFRoZSBvcHRpb25zIG9wdGlvbnMuXG4gICAqL1xuICBvcHRpb25zKCkge1xuICAgIGlmICghdGhpcy5fb3B0aW9ucykgdGhpcy5fb3B0aW9ucyA9IG5ldyBPcHRpb25zKHtkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNcbiAgfVxuXG4gIGFzeW5jIF9zdGFydFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgIGF3YWl0IHRoaXMuX3J1blBoeXNpY2FsQ29ubmVjdGlvblJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmdcIilcbiAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuXG4gICAgICB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24gPSBuZXcgbXNzcWwuVHJhbnNhY3Rpb24odGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24uYmVnaW4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfY29tbWl0VHJhbnNhY3Rpb25BY3Rpb24oKSB7XG4gICAgYXdhaXQgdGhpcy5fcnVuUGh5c2ljYWxDb25uZWN0aW9uUmVxdWVzdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQSB0cmFuc2FjdGlvbiBpc24ndCBydW5uaW5nXCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbi5jb21taXQoKVxuICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICBhd2FpdCB0aGlzLl9ydW5QaHlzaWNhbENvbm5lY3Rpb25SZXF1ZXN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiQSB0cmFuc2FjdGlvbiBpc24ndCBydW5uaW5nIC0gaWdub3JpbmcgYmVjYXVzZSB0aGF0IGNhbiBoYXBwZW4gaWYgc29tZXRoaW5nIGVsc2UgaGFzIGZhaWxlZCBpbiB0aGUgZGJcIilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbi5yb2xsYmFjaygpXG4gICAgICB9IGNhdGNoICh0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgLy8gV2hlbiBTUUwgU2VydmVyIGhhcyBhbHJlYWR5IGFib3J0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuLCBhXG4gICAgICAgIC8vIHN0YWxlIGNvbmN1cnJlbnQgcmVxdWVzdCB0cmlnZ2VyZWQgWEFDVF9BQk9SVCksIHRoZVxuICAgICAgICAvLyBtc3NxbC5UcmFuc2FjdGlvbi5yb2xsYmFjaygpIGNhbGwgZmFpbHMgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gb2JqZWN0IGlzIGRlYWQuICBJc3N1ZSBhIHJhdyBST0xMQkFDSyBvbiB0aGVcbiAgICAgICAgLy8gdW5kZXJseWluZyBjb25uZWN0aW9uIHRvIGNsZWFyIFNRTCBTZXJ2ZXIncyBzZXNzaW9uLWxldmVsXG4gICAgICAgIC8vIGFib3J0ZWQtdHJhbnNhY3Rpb24gc3RhdGUgc28gdGhlIGNvbm5lY3Rpb24gaXMgdXNhYmxlIGZvciB0aGVcbiAgICAgICAgLy8gbmV4dCBCRUdJTiBUUkFOU0FDVElPTi5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRyYW5zYWN0aW9uLnJvbGxiYWNrKCkgZmFpbGVkLCBjbGVhcmluZyBzZXNzaW9uIHN0YXRlIHdpdGggcmF3IFJPTExCQUNLXCIsIHtcbiAgICAgICAgICBlcnJvcjogdHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3IubWVzc2FnZSA6IHRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG5cbiAgICAgICAgYXdhaXQgcmVxdWVzdC5xdWVyeShcIklGIEBAVFJBTkNPVU5UID4gMCBST0xMQkFDS1wiKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydCBzYXZlIHBvaW50IGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBTYXZlIHBvaW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3N0YXJ0U2F2ZVBvaW50QWN0aW9uKHNhdmVQb2ludE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoYFNBVkUgVFJBTlNBQ1RJT04gWyR7c2F2ZVBvaW50TmFtZX1dYCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGVhc2Ugc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtfb3B0aW9uc10gLSBUcmFuc2FjdGlvbiBvd25lcnNoaXAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcmVsZWFzZVNhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBfb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gRG8gbm90aGluZyBpbiBNUy1TUUwuXG4gIH1cblxuICAvKipcbiAgICogUnVucyByb2xsYmFjayBzYXZlIHBvaW50IGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBTYXZlIHBvaW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JvbGxiYWNrU2F2ZVBvaW50QWN0aW9uKHNhdmVQb2ludE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBST0xMQkFDSyBUUkFOU0FDVElPTiBbJHtzYXZlUG9pbnROYW1lfV1gLCBvcHRpb25zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBgJHtlcnJvcn1gXG5cbiAgICAgIC8vIFdoZW4gWEFDVF9BQk9SVCBraWxscyB0aGUgZW50aXJlIHRyYW5zYWN0aW9uLCB0aGUgc2F2ZXBvaW50XG4gICAgICAvLyBubyBsb25nZXIgZXhpc3RzIGFuZCB0aGUgUk9MTEJBQ0sgVFJBTlNBQ1RJT04gW25hbWVdIGZhaWxzLlxuICAgICAgLy8gSXNzdWUgYSByYXcgSUYgQEBUUkFOQ09VTlQgPiAwIFJPTExCQUNLIHRvIGNsZWFyIHdoYXRldmVyXG4gICAgICAvLyBzZXNzaW9uIHN0YXRlIHJlbWFpbnMsIHRoZW4gbGV0IHRoZSBlcnJvciBwcm9wYWdhdGUgc28gdGhlXG4gICAgICAvLyBvdXRlciB0cmFuc2FjdGlvbigpIGNhbGwga25vd3MgdGhlIHRyYW5zYWN0aW9uIGlzIGRlYWQuXG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIlRyYW5zYWN0aW9uIGhhcyBub3QgYmVndW5cIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIlRyYW5zYWN0aW9uIGhhcyBiZWVuIGFib3J0ZWRcIikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJTYXZlcG9pbnQgcm9sbGJhY2sgZmFpbGVkOyB0cmFuc2FjdGlvbiBhbHJlYWR5IGRlYWQsIGNsZWFyaW5nIHNlc3Npb24gc3RhdGVcIilcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICAgIGF3YWl0IHJlcXVlc3QucXVlcnkoXCJJRiBAQFRSQU5DT1VOVCA+IDAgUk9MTEJBQ0tcIilcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVNhdmVQb2ludE5hbWUoKSB7XG4gICAgcmV0dXJuIGBzcCR7bmV3IFVVSUQoNCkuZm9ybWF0KCkucmVwbGFjZUFsbChcIi1cIiwgXCJcIil9YC5zdWJzdHJpbmcoMCwgMzIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGRhdGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBkYXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBkYXRlU3FsKHtjb25kaXRpb25zLCBkYXRhLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IFVwZGF0ZSh7Y29uZGl0aW9ucywgZGF0YSwgZHJpdmVyOiB0aGlzLCB0YWJsZU5hbWV9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBzZXJ0U3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBzZXJ0U3FsKGFyZ3MpIHtcbiAgICBjb25zdCB1cHNlcnQgPSBuZXcgVXBzZXJ0KHsuLi5hcmdzLCBkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHVwc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdHJ1Y3R1cmUgc3FsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBzdHJ1Y3R1cmVTcWwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NhY2hlZFNjaGVtYU1ldGFkYXRhKFwic3RydWN0dXJlU3FsXCIsIGFzeW5jICgpID0+IGF3YWl0IG5ldyBTdHJ1Y3R1cmVTcWwoe2RyaXZlcjogdGhpc30pLnRvU3FsKCkpXG4gIH1cblxuICAvKipcbiAgICogQmxvY2tzIHVudGlsIGEgU1FMIFNlcnZlciBhcHBsaWNhdGlvbiBsb2NrIGlzIGFjcXVpcmVkIG9uIHRoaXNcbiAgICogY29ubmVjdGlvbiB2aWEgYHNwX2dldGFwcGxvY2tgLiBUaGUgU2Vzc2lvbiBsb2NrIG93bmVyIHNjb3BlcyB0aGUgbG9ja1xuICAgKiB0byB0aGUgY3VycmVudCBzZXNzaW9uLCBtYXRjaGluZyB0aGUgY29ubmVjdGlvbi1zY29wZWQgc2VtYW50aWNzIG9uXG4gICAqIE15U1FMIGFuZCBQb3N0Z3JlU1FMLlxuICAgKlxuICAgKiBgc3BfZ2V0YXBwbG9ja2AgcmV0dXJucyAwIG9uIGltbWVkaWF0ZSBncmFudCwgMSBhZnRlciB3YWl0aW5nLCBhbmRcbiAgICogbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUgKHRpbWVvdXQsIGRlYWRsb2NrLCBjYW5jZWxlZCwgcGFyYW1ldGVyXG4gICAqIGVycm9yKS4gV2UgdHJlYXQgMC8xIGFzIHN1Y2Nlc3MgYW5kIC0xICh0aW1lb3V0KSBhcyBhIGNsZWFuIGBmYWxzZWA7XG4gICAqIGFueXRoaW5nIGVsc2UgdGhyb3dzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBuZWdhdGl2ZSBibG9ja3MgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgYWNxdWlyZWQsIGZhbHNlIGlmIHRoZSB0aW1lb3V0IGVsYXBzZWQuXG4gICAqL1xuICBhc3luYyBfYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zfSA9IHt9KSB7XG4gICAgY29uc3QgdGltZW91dFZhbHVlID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiAmJiB0aW1lb3V0TXMgPj0gMCA/IE1hdGguY2VpbCh0aW1lb3V0TXMpIDogLTFcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5fYWR2aXNvcnlMb2NrUXVlcnkoXG4gICAgICBgREVDTEFSRSBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0IElOVDsgRVhFQyBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0ID0gc3BfZ2V0YXBwbG9jayBAUmVzb3VyY2UgPSAke3RoaXMucXVvdGUobmFtZSl9LCBATG9ja01vZGUgPSAnRXhjbHVzaXZlJywgQExvY2tPd25lciA9ICdTZXNzaW9uJywgQExvY2tUaW1lb3V0ID0gJHt0aW1lb3V0VmFsdWV9OyBTRUxFQ1QgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgXG4gICAgKVxuICAgIGNvbnN0IHJlc3VsdCA9IE51bWJlcihyb3dzPy5bMF0/LnZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdClcblxuICAgIGlmIChyZXN1bHQgPT09IDAgfHwgcmVzdWx0ID09PSAxKSByZXR1cm4gdHJ1ZVxuXG4gICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpXG5cbiAgICBpZiAocmVzdWx0ID09PSAtMSkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNwX2dldGFwcGxvY2sgcmV0dXJuZWQgJHtyZXN1bHR9IGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IChzZWUgU1FMIFNlcnZlciBkb2N1bWVudGF0aW9uIGZvciBzcF9nZXRhcHBsb2NrIHJldHVybiBjb2RlcylgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdHJ5IGFjcXVpcmUgYWR2aXNvcnkgbG9jay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGFjcXVpcmVkLCBmYWxzZSBpZiBpdCB3YXMgYWxyZWFkeSBoZWxkLlxuICAgKi9cbiAgYXN5bmMgX3RyeUFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUsIHt0aW1lb3V0TXM6IDB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVsZWFzZSBhZHZpc29yeSBsb2NrLlxuICAgKlxuICAgKiBgc3BfcmVsZWFzZWFwcGxvY2tgIHJldHVybnMgMCB3aGVuIHRoZSBsb2NrIHdhcyByZWxlYXNlZCwgYnV0IFNRTCBTZXJ2ZXJcbiAgICogcmFpc2VzIGVycm9yIHtAbGluayBBUFBMT0NLX05PVF9IRUxEX0VSUk9SX05VTUJFUn0gaW5zdGVhZCBvZiByZXR1cm5pbmcgYVxuICAgKiBmYWlsdXJlIGNvZGUgd2hlbiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBjdXJyZW50bHkgaG9sZCB0aGUgbG9jay4gVGhhdFxuICAgKiBlcnJvciBhYm9ydHMgdGhlIGJhdGNoIGJlZm9yZSB0aGUgdHJhaWxpbmcgYFNFTEVDVGAgY2FuIHJ1biwgc28gd2UgY2F0Y2hcbiAgICogaXQgYW5kIHJlc29sdmUgdG8gYGZhbHNlYCB0byBob25vciB0aGUgY3Jvc3MtZHJpdmVyIGNvbnRyYWN0IGZvciBhblxuICAgKiBhbHJlYWR5LXVuaGVsZCBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgaGVsZCBieSB0aGlzIHNlc3Npb24gYW5kIGhhcyBub3cgYmVlbiByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIF9yZWxlYXNlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICBsZXQgcm93c1xuXG4gICAgdHJ5IHtcbiAgICAgIHJvd3MgPSBhd2FpdCB0aGlzLl9hZHZpc29yeUxvY2tRdWVyeShcbiAgICAgICAgYERFQ0xBUkUgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBJTlQ7IEVYRUMgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCA9IHNwX3JlbGVhc2VhcHBsb2NrIEBSZXNvdXJjZSA9ICR7dGhpcy5xdW90ZShuYW1lKX0sIEBMb2NrT3duZXIgPSAnU2Vzc2lvbic7IFNFTEVDVCBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0IEFTIHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdGBcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuX2lzQXBwbG9ja05vdEhlbGRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKClcblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQpXG5cbiAgICBhd2FpdCB0aGlzLl9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uSWZGaW5hbFJlbGVhc2UoKVxuXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYWR2aXNvcnktbG9jayBzdGF0ZW1lbnQgdGhyb3VnaCBvbmUgdHJhbnNhY3Rpb24gcmVxdWVzdCBwYXJlbnQuXG4gICAqIG5vZGUtbXNzcWwgcmVzZXJ2ZXMgb25lIHBoeXNpY2FsIHNlc3Npb24gZm9yIGEgVHJhbnNhY3Rpb24sIHdoZXJlYXNcbiAgICogc2VwYXJhdGUgQ29ubmVjdGlvblBvb2wgcmVxdWVzdHMgbWF5IGNoZWNrIG91dCBkaWZmZXJlbnQgc2Vzc2lvbnMuIFRoZVxuICAgKiB0cmFuc2FjdGlvbiBjb250YWlucyBvbmx5IGFwcGxpY2F0aW9uLWxvY2sgc3RhdGVtZW50czsgY2FsbGVyL21vZGVsIHdvcmtcbiAgICogY29udGludWVzIHRocm91Z2ggaXRzIG9yaWdpbmFsIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBBZHZpc29yeS1sb2NrIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeVJlc3VsdFR5cGU+fSAtIFJlc3VsdCByb3dzLlxuICAgKi9cbiAgYXN5bmMgX2Fkdmlzb3J5TG9ja1F1ZXJ5KHNxbCkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5fZW5zdXJlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgbXNzcWwuUmVxdWVzdCh0cmFuc2FjdGlvbilcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QucXVlcnkoc3FsKVxuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXN1bHQucmVjb3Jkc2V0cykgPyByZXN1bHQucmVjb3Jkc2V0c1swXSB8fCBbXSA6IFtdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yLm1lc3NhZ2V9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yfSc6ICR7c3FsfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgcGFyZW50IHRoYXQgcmVzZXJ2ZXMgdGhlIGFkdmlzb3J5LWxvY2tcbiAgICogc2Vzc2lvbiB1bnRpbCB0aGUgZmluYWwgcmVsZWFzZSBvciBkcml2ZXIgY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIm1zc3FsXCIpLlRyYW5zYWN0aW9uPn0gLSBTZXNzaW9uLWFmZmluZSBwYXJlbnQuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKSByZXR1cm4gdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25cbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTVNTUUwgY29ubmVjdGlvbiB1bmF2YWlsYWJsZSBmb3IgYWR2aXNvcnkgbG9ja1wiKVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgbXNzcWwuVHJhbnNhY3Rpb24odGhpcy5jb25uZWN0aW9uKVxuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24uYmVnaW4oKVxuICAgIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25cblxuICAgIHJldHVybiB0cmFuc2FjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIHRoZSByZXNlcnZlZCBzZXNzaW9uIGFmdGVyIHRoZSBsYXN0IHRyYWNrZWQgbG9jayByZWxlYXNlLlxuICAgKiBCYXNlIHVudHJhY2tzIHRoZSBjdXJyZW50IHJlbGVhc2UgYWZ0ZXIgdGhlIGRyaXZlciBob29rIHJldHVybnMsIHNvIGFcbiAgICogY3VycmVudCB0b3RhbCBvZiBvbmUgbWVhbnMgdGhpcyBpcyB0aGUgZmluYWwgcmVsZWFzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgY2xlYW51cCB3aGVuIHRoaXMgaXMgZmluYWwuXG4gICAqL1xuICBhc3luYyBfY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKCkge1xuICAgIGxldCBoZWxkQ291bnQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGNvdW50IG9mIHRoaXMuX2hlbGRBZHZpc29yeUxvY2tzLnZhbHVlcygpKSBoZWxkQ291bnQgKz0gY291bnRcblxuICAgIGlmIChoZWxkQ291bnQgPD0gMSkgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayB0aGUgb3RoZXJ3aXNlLWVtcHR5IHRyYW5zYWN0aW9uIGFuZCByZXR1cm5zIGl0cyBwaHlzaWNhbFxuICAgKiBzZXNzaW9uIHRvIG5vZGUtbXNzcWwuIFJvbGxiYWNrIGlzIGNsZWFudXAgb25seTsgYWR2aXNvcnkgbG9ja3MgYXJlXG4gICAqIGV4cGxpY2l0bHkgcmVsZWFzZWQgZmlyc3Qgd2hlbmV2ZXIgdGhlaXIgcmVsZWFzZSBzdGF0ZW1lbnQgc3VjY2VlZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNlc3Npb24gY2xlYW51cC5cbiAgICovXG4gIGFzeW5jIF9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKCkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25cblxuICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24gPSBudWxsXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucm9sbGJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgdGhlIFNRTCBTZXJ2ZXIgXCJhcHBsaWNhdGlvbiBsb2NrIGlzIG5vdCBjdXJyZW50bHkgaGVsZFwiIGVycm9yXG4gICAqIHJhaXNlZCBieSBgc3BfcmVsZWFzZWFwcGxvY2tgLiBJdCB3YWxrcyB0aGUgd3JhcHBlZC1lcnJvciBjYXVzZSBjaGFpblxuICAgKiBiZWNhdXNlIGBxdWVyeWAgcmUtd3JhcHMgdGhlIGRyaXZlcidzIGBSZXF1ZXN0RXJyb3JgIGluIGEgcGxhaW4gYEVycm9yYCxcbiAgICogYW5kIG1hdGNoZXMgb24gdGhlIHN0YWJsZSBudW1lcmljIGVycm9yIG51bWJlciByYXRoZXIgdGhhbiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIEVycm9yIHRocm93biB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGVycm9yIG1lYW5zIHRoZSBsb2NrIHdhcyBub3QgaGVsZCBieSB0aGlzIHNlc3Npb24uXG4gICAqL1xuICBfaXNBcHBsb2NrTm90SGVsZEVycm9yKGVycm9yKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBlcnJvclxuXG4gICAgd2hpbGUgKGN1cnJlbnQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JOdW1iZXIgPSAvKiogQHR5cGUge3tudW1iZXI/OiB1bmtub3dufX0gKi8gKGN1cnJlbnQpLm51bWJlclxuXG4gICAgICBpZiAodHlwZW9mIGVycm9yTnVtYmVyID09PSBcIm51bWJlclwiICYmIGVycm9yTnVtYmVyID09PSBBUFBMT0NLX05PVF9IRUxEX0VSUk9SX05VTUJFUikgcmV0dXJuIHRydWVcblxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2F1c2VcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHNlc3Npb24gY3VycmVudGx5IGhvbGRzIHRoZSBhcHBsaWNhdGlvbiBsb2NrLlxuICAgKlxuICAgKiBUaGlzIGNvbWJpbmVzIHR3byBwcm9iZXMgYmVjYXVzZSBuZWl0aGVyIGlzIHN1ZmZpY2llbnQgb24gaXRzIG93bjpcbiAgICogICAtIGBBUFBMT0NLX01PREUoLi4uLCAnU2Vzc2lvbicpYCBvbmx5IHJlcG9ydHMgbG9ja3MgaGVsZCBieSB0aGVcbiAgICogICAgICoqY3VycmVudCoqIHNlc3Npb24sIHNvIGl0IG1pc3NlcyBsb2NrcyBoZWxkIGJ5IGFueSBvdGhlclxuICAgKiAgICAgc2Vzc2lvbiBhbmQgd291bGQgcmV0dXJuIGBOb0xvY2tgIGV2ZW4gdW5kZXIgY3Jvc3Mtc2Vzc2lvblxuICAgKiAgICAgY29udGVudGlvbi5cbiAgICogICAtIGBBUFBMT0NLX1RFU1QoLi4uLCAnRXhjbHVzaXZlJywgJ1Nlc3Npb24nKWAgcmV0dXJucyB3aGV0aGVyIGFuXG4gICAqICAgICBFeGNsdXNpdmUgbG9jayBjb3VsZCBiZSBncmFudGVkIHRvICp0aGlzKiBzZXNzaW9uIHJpZ2h0IG5vdy4gQVxuICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIDAgbWVhbnMgc29tZWJvZHkgZWxzZSBob2xkcyBhbiBpbmNvbXBhdGlibGVcbiAgICogICAgIGxvY2s7IGEgdmFsdWUgb2YgMSBtZWFucyBpdCBpcyBlaXRoZXIgZnJlZSAqKm9yKiogYWxyZWFkeSBoZWxkXG4gICAqICAgICBieSB1cyByZS1lbnRyYW50bHkgKHdoaWNoIHRoZSBgQVBQTE9DS19NT0RFYCBjaGVjayBjYXRjaGVzKS5cbiAgICpcbiAgICogVGhlIGNvbWJpbmVkIHJlc3VsdCBpcyBcImhlbGRcIiBpZmYgd2UgaG9sZCBpdCBvdXJzZWx2ZXMgb3JcbiAgICogYEFQUExPQ0tfVEVTVGAgcmVwb3J0cyB3ZSBjYW5ub3QgYWNxdWlyZSBpdCB3aXRob3V0IHdhaXRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIGFueSBzZXNzaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgbG9jay5cbiAgICovXG4gIGFzeW5jIGlzQWR2aXNvcnlMb2NrSGVsZChuYW1lKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBgU0VMRUNUIGAgK1xuICAgICAgICBgQVBQTE9DS19NT0RFKCdwdWJsaWMnLCAke3RoaXMucXVvdGUobmFtZSl9LCAnU2Vzc2lvbicpIEFTIHZlbG9jaW91c19hZHZpc29yeV9zZWxmX21vZGUsIGAgK1xuICAgICAgICBgQVBQTE9DS19URVNUKCdwdWJsaWMnLCAke3RoaXMucXVvdGUobmFtZSl9LCAnRXhjbHVzaXZlJywgJ1Nlc3Npb24nKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfdGVzdF9yZXN1bHRgXG4gICAgKVxuICAgIGNvbnN0IHNlbGZNb2RlID0gcm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfc2VsZl9tb2RlXG4gICAgY29uc3QgaGVsZEJ5U2VsZiA9IHR5cGVvZiBzZWxmTW9kZSA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmTW9kZS5sZW5ndGggPiAwICYmIHNlbGZNb2RlICE9PSBcIk5vTG9ja1wiXG5cbiAgICBpZiAoaGVsZEJ5U2VsZikgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfdGVzdF9yZXN1bHQpXG5cbiAgICByZXR1cm4gdGVzdFJlc3VsdCA9PT0gMFxuICB9XG59XG4iXX0=
784
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9tc3NxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFDNUMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sNkJBQTZC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QUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUN6QixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO1FBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDM0IsU0FBUztZQUNQLDBCQUEwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnREFBZ0Q7WUFDMUYsMEJBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUMxRyxDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsNEJBQTRCLENBQUE7UUFDeEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUE7UUFFL0YsSUFBSSxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFM0IsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUE7UUFFcEUsT0FBTyxVQUFVLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWx0ZXJUYWJsZSBmcm9tIFwiLi9zcWwvYWx0ZXItdGFibGUuanNcIlxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2Jhc2UuanNcIlxuaW1wb3J0IENyZWF0ZURhdGFiYXNlIGZyb20gXCIuL3NxbC9jcmVhdGUtZGF0YWJhc2UuanNcIlxuaW1wb3J0IENyZWF0ZUluZGV4IGZyb20gXCIuL3NxbC9jcmVhdGUtaW5kZXguanNcIlxuaW1wb3J0IENyZWF0ZVRhYmxlIGZyb20gXCIuL3NxbC9jcmVhdGUtdGFibGUuanNcIlxuaW1wb3J0IERlbGV0ZSBmcm9tIFwiLi9zcWwvZGVsZXRlLmpzXCJcbmltcG9ydCBEcm9wRGF0YWJhc2UgZnJvbSBcIi4vc3FsL2Ryb3AtZGF0YWJhc2UuanNcIlxuaW1wb3J0IERyb3BUYWJsZSBmcm9tIFwiLi9zcWwvZHJvcC10YWJsZS5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IGVzY2FwZVN0cmluZyBmcm9tIFwic3FsLWVzY2FwZS1zdHJpbmdcIlxuaW1wb3J0IEluc2VydCBmcm9tIFwiLi9zcWwvaW5zZXJ0LmpzXCJcbmltcG9ydCBPcHRpb25zIGZyb20gXCIuL29wdGlvbnMuanNcIlxuaW1wb3J0IG1zc3FsIGZyb20gXCJtc3NxbFwiXG5pbXBvcnQgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5pbXBvcnQgUXVlcnlQYXJzZXIgZnJvbSBcIi4vcXVlcnktcGFyc2VyLmpzXCJcbmltcG9ydCBSZW1vdmVJbmRleCBmcm9tIFwiLi9zcWwvcmVtb3ZlLWluZGV4LmpzXCJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi90YWJsZS5qc1wiXG5pbXBvcnQgU3RydWN0dXJlU3FsIGZyb20gXCIuL3N0cnVjdHVyZS1zcWwuanNcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFVwc2VydCBmcm9tIFwiLi9zcWwvdXBzZXJ0LmpzXCJcbmltcG9ydCBVcGRhdGUgZnJvbSBcIi4vc3FsL3VwZGF0ZS5qc1wiXG5pbXBvcnQgVVVJRCBmcm9tIFwicHVyZS11dWlkXCJcblxuLyoqXG4gKiBTUUwgU2VydmVyIGVycm9yIG51bWJlciByYWlzZWQgYnkgYHNwX3JlbGVhc2VhcHBsb2NrYCB3aGVuIHRoZSBjdXJyZW50XG4gKiBzZXNzaW9uIGRvZXMgbm90IGhvbGQgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBsb2NrLiBSZWxlYXNpbmcgYSBsb2NrIHRoZVxuICogc2Vzc2lvbiBubyBsb25nZXIgaG9sZHMgaXMgYSBub3JtYWwgcmFjZSAoYSBzaGFyZWQgY29ubmVjdGlvbidzIGZpbmFsXG4gKiBjaGVjay1pbiBtYXkgYWxyZWFkeSBoYXZlIGF1dG8tcmVsZWFzZWQgaXQpLCB3aGljaCB0aGUgY3Jvc3MtZHJpdmVyXG4gKiBgcmVsZWFzZUFkdmlzb3J5TG9ja2AgY29udHJhY3QgbW9kZWxzIGJ5IHJlc29sdmluZyB0byBgZmFsc2VgLiBXZSB0cmFuc2xhdGVcbiAqIHRoaXMgc3BlY2lmaWMgZXJyb3IgaW50byB0aGF0IHJlc3VsdCByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGVzY2FwZS5cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IEFQUExPQ0tfTk9UX0hFTERfRVJST1JfTlVNQkVSID0gMTIyM1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNNc3NxbCBleHRlbmRzIEJhc2V7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwibXNzcWxcIikuVHJhbnNhY3Rpb24gfCBudWxsfSAqL1xuICBfYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24gPSBudWxsXG5cbiAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5nZXRBcmdzKClcbiAgICBjb25zdCBzcWxDb25maWcgPSBkaWdnKGFyZ3MsIFwic3FsQ29uZmlnXCIpXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikgYXdhaXQgdGhpcy5jbG9zZSgpXG5cbiAgICAgIGlmIChzcWxDb25maWcpIHtcbiAgICAgICAgc3FsQ29uZmlnLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzcWxDb25maWcub3B0aW9ucywge3VzZVVUQzogdHJ1ZX0pXG4gICAgICB9XG5cbiAgICAgIGlmIChzcWxDb25maWc/LnNlcnZlciAmJiAhc3FsQ29uZmlnLm9wdGlvbnM/LnNlcnZlck5hbWUgJiYgbmV0LmlzSVAoc3FsQ29uZmlnLnNlcnZlcikpIHtcbiAgICAgICAgc3FsQ29uZmlnLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBzcWxDb25maWcub3B0aW9ucywge3NlcnZlck5hbWU6IFwiXCJ9KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgbXNzcWwuQ29ubmVjdGlvblBvb2woc3FsQ29uZmlnKVxuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNvbm5lY3QoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZS10aHJvdyB0byBmaXggdW51c2VhYmxlIHN0YWNrIHRyYWNlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBjb25uZWN0IHRvIGRhdGFiYXNlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2Nsb3NlKCkge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSByZXR1cm5cblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24gPSBudWxsXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25zQ291bnQgPSAwXG4gICAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgc2Vzc2lvbkVycm9yXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNlc3Npb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjbG9zZSBNU1NRTCBhZHZpc29yeS1sb2NrIHNlc3Npb25cIiwge2NhdXNlOiBlcnJvcn0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDIwMDB9LCAoKSA9PiBjb25uZWN0aW9uLmNsb3NlKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gY2xvc2UgTVNTUUwgY29ubmVjdGlvbiBjbGVhbmx5XCIsIHtlcnJvcn0pXG4gICAgfVxuXG4gICAgaWYgKHNlc3Npb25FcnJvcikgdGhyb3cgc2Vzc2lvbkVycm9yXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbHRlciB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3RhYmxlLWRhdGEvaW5kZXguanNcIikuZGVmYXVsdH0gdGFibGVEYXRhIC0gVGFibGUgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBhbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpIHtcbiAgICBjb25zdCBhbHRlckFyZ3MgPSB7dGFibGVEYXRhLCBkcml2ZXI6IHRoaXN9XG4gICAgY29uc3QgYWx0ZXJUYWJsZSA9IG5ldyBBbHRlclRhYmxlKGFsdGVyQXJncylcblxuICAgIHJldHVybiBhd2FpdCBhbHRlclRhYmxlLnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgZGF0YWJhc2Ugc3FsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gRGF0YWJhc2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmlmTm90RXhpc3RzXSAtIFdoZXRoZXIgaWYgbm90IGV4aXN0cy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgY3JlYXRlRGF0YWJhc2VTcWwoZGF0YWJhc2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RhdGFiYXNlTmFtZSwgZHJpdmVyOiB0aGlzfSwgYXJncylcbiAgICBjb25zdCBjcmVhdGVEYXRhYmFzZSA9IG5ldyBDcmVhdGVEYXRhYmFzZShjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFiYXNlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgZGF0YWJhc2Ugc3FsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gRGF0YWJhc2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmlmRXhpc3RzXSAtIFdoZXRoZXIgaWYgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBkcm9wRGF0YWJhc2VTcWwoZGF0YWJhc2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkYXRhYmFzZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgZHJvcERhdGFiYXNlID0gbmV3IERyb3BEYXRhYmFzZShkcm9wQXJncylcblxuICAgIHJldHVybiBkcm9wRGF0YWJhc2UudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIGluZGV4IHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5DcmVhdGVJbmRleFNxbEFyZ3N9IGluZGV4RGF0YSAtIEluZGV4IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5kZXhTUUxzKGluZGV4RGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBpbmRleERhdGEpXG4gICAgY29uc3QgY3JlYXRlSW5kZXggPSBuZXcgQ3JlYXRlSW5kZXgoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbmRleC50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4IHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5SZW1vdmVJbmRleFNxbEFyZ3N9IGluZGV4RGF0YSAtIEluZGV4IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlSW5kZXhTUUxzKGluZGV4RGF0YSkge1xuICAgIGNvbnN0IHJlbW92ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBpbmRleERhdGEpXG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBuZXcgUmVtb3ZlSW5kZXgocmVtb3ZlQXJncylcblxuICAgIHJldHVybiBhd2FpdCByZW1vdmVJbmRleC50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIHRhYmxlIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCIpLmRlZmF1bHR9IHRhYmxlRGF0YSAtIFRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IHt0YWJsZURhdGEsIGRyaXZlcjogdGhpcywgaW5kZXhJbkNyZWF0ZVRhYmxlOiBmYWxzZX1cbiAgICBjb25zdCBjcmVhdGVUYWJsZSA9IG5ldyBDcmVhdGVUYWJsZShjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZVRhYmxlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGN1cnJlbnQgZGF0YWJhc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudCBkYXRhYmFzZS5cbiAgICovXG4gIGFzeW5jIGN1cnJlbnREYXRhYmFzZSgpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShcIlNFTEVDVCBEQl9OQU1FKCkgQVMgZGJfbmFtZVwiKVxuXG4gICAgcmV0dXJuIGRpZ2cocm93cywgMCwgXCJkYl9uYW1lXCIpXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgZXZlcnkgZm9yZWlnbiBrZXkgY29uc3RyYWludCAoYnVsayBgTk9DSEVDS2ApLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGZvcmVpZ24ga2V5cyBhcmUgZGlzYWJsZWQuXG4gICAqL1xuICBhc3luYyBkaXNhYmxlRm9yZWlnbktleXMoKSB7XG4gICAgYXdhaXQgdGhpcy5fZXhlY0NvbnN0cmFpbnRUb2dnbGUoXCJFWEVDIHNwX01TZm9yZWFjaHRhYmxlIFxcXCJBTFRFUiBUQUJMRSA/IE5PQ0hFQ0sgQ09OU1RSQUlOVCBhbGxcXFwiXCIsIFwiZGlzYWJsZUZvcmVpZ25LZXlzXCIpXG4gIH1cblxuICAvKipcbiAgICogUmUtZW5hYmxlcyBhbmQgcmUtdmFsaWRhdGVzIGV2ZXJ5IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgKGBXSVRIIENIRUNLYCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZm9yZWlnbiBrZXlzIGFyZSBlbmFibGVkLlxuICAgKi9cbiAgYXN5bmMgZW5hYmxlRm9yZWlnbktleXMoKSB7XG4gICAgYXdhaXQgdGhpcy5fZXhlY0NvbnN0cmFpbnRUb2dnbGUoXCJFWEVDIHNwX01TZm9yZWFjaHRhYmxlIEBjb21tYW5kMT1cXFwicHJpbnQgJz8nXFxcIiwgQGNvbW1hbmQyPVxcXCJBTFRFUiBUQUJMRSA/IFdJVEggQ0hFQ0sgQ0hFQ0sgQ09OU1RSQUlOVCBhbGxcXFwiXCIsIFwiZW5hYmxlRm9yZWlnbktleXNcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBjb25zdHJhaW50LXRvZ2dsZSBzdGF0ZW1lbnQuIGBBTFRFUiBUQUJMRSAuLi4gTk9DSEVDSy9DSEVDS1xuICAgKiBDT05TVFJBSU5UYCBuZWVkcyBhIHNjaGVtYS1tb2RpZmljYXRpb24gbG9jayBvbiBldmVyeSB0YWJsZSwgc28gaWYgdGhlXG4gICAqIHJlcXVlc3QgdGltZXMgb3V0IGl0IGlzIGFsbW9zdCBhbHdheXMgYmxvY2tlZCBieSBhbm90aGVyIHNlc3Npb24gdGhhdCBpc1xuICAgKiBzdGlsbCBob2xkaW5nIGEgbG9jayAoYSBsZWFrZWQvdW5jb21taXR0ZWQgY29ubmVjdGlvbikuIE9uIGEgdGltZW91dCxcbiAgICogY2FwdHVyZSB3aGljaCBzZXNzaW9ucyB3ZXJlIGJsb2NraW5nIHNvIHRoZSByZWFsIGN1bHByaXQgaXMgbmFtZWQgaW5zdGVhZFxuICAgKiBvZiBsZWF2aW5nIGEgYmFyZSBcIlJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGluIDE1MDAwbXNcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIENvbnN0cmFpbnQtdG9nZ2xlIFNRTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gT3BlcmF0aW9uIGxhYmVsIGZvciB0aGUgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHRvZ2dsZSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfZXhlY0NvbnN0cmFpbnRUb2dnbGUoc3FsLCBsYWJlbCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KHNxbClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgL1RpbWVvdXQ6IFJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlL2kudGVzdChlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuX2NhcHR1cmVCbG9ja2luZ1Nlc3Npb25zRm9yRGVidWcoKS5jYXRjaChcbiAgICAgICAgICAoZGlhZ0Vycm9yKSA9PiBgKGJsb2NraW5nIGRpYWdub3N0aWNzIHF1ZXJ5IGZhaWxlZDogJHtkaWFnRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGRpYWdFcnJvci5tZXNzYWdlIDogZGlhZ0Vycm9yfSlgXG4gICAgICAgIClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX1cXG5cXG5bJHtsYWJlbH0gYmxvY2tlZF0gb3RoZXIgdXNlciBzZXNzaW9ucyB3aXRoIG9wZW4gdHJhbnNhY3Rpb25zIG9yIGFjdGl2ZSByZXF1ZXN0czpcXG4ke3NuYXBzaG90fWAsIHtjYXVzZTogZXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbmFwc2hvdHMgdGhlIHNlc3Npb25zIHRoYXQgY291bGQgYmUgYmxvY2tpbmcgYSBjb25zdHJhaW50IHRvZ2dsZSBpbiBUSElTXG4gICAqIGRhdGFiYXNlIOKAlCBldmVyeSBzZXNzaW9uIG90aGVyIHRoYW4gdGhpcyBvbmUgdGhhdCBob2xkcyBhIGxvY2sgaW4gYERCX0lEKClgXG4gICAqIG9yIGlzIHJ1bm5pbmcgYSByZXF1ZXN0IGFnYWluc3QgaXQg4oCUIHdpdGggaXRzIGxhc3Qgc3RhdGVtZW50LCB3YWl0IHN0YXRlLFxuICAgKiBhbmQgYmxvY2tpbmcgc2Vzc2lvbiwgZW5vdWdoIHRvIGlkZW50aWZ5IGEgY29ubmVjdGlvbiB0aGF0IGxlYWtlZCBhIGxvY2suXG4gICAqIFNjb3BlZCB0byB0aGUgY3VycmVudCBkYXRhYmFzZSBzbyBhIG11bHRpLWRhdGFiYXNlIHNlcnZlciBkb2VzIG5vdCBsZWFrXG4gICAqIHVucmVsYXRlZCBzZXNzaW9ucycgU1FMIGludG8gdGhlIGVycm9yIGFuZCBidXJ5IHRoZSByZWFsIGJsb2NrZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSlNPTiBzbmFwc2hvdCwgb3IgYSBcIihub25lKVwiIG1hcmtlci5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlQmxvY2tpbmdTZXNzaW9uc0ZvckRlYnVnKCkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBcbiAgICAgIFdJVEggbG9ja19zZXNzaW9ucyBBUyAoXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCByZXF1ZXN0X3Nlc3Npb25faWQgQVMgc2Vzc2lvbl9pZFxuICAgICAgICBGUk9NIHN5cy5kbV90cmFuX2xvY2tzXG4gICAgICAgIFdIRVJFIHJlc291cmNlX2RhdGFiYXNlX2lkID0gREJfSUQoKVxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIHMuc2Vzc2lvbl9pZCBBUyBzZXNzaW9uSWQsXG4gICAgICAgIHMuc3RhdHVzIEFTIHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHMubG9naW5fdGltZSBBUyBsb2dpblRpbWUsXG4gICAgICAgIHMubGFzdF9yZXF1ZXN0X3N0YXJ0X3RpbWUgQVMgbGFzdFJlcXVlc3RTdGFydCxcbiAgICAgICAgcy5sYXN0X3JlcXVlc3RfZW5kX3RpbWUgQVMgbGFzdFJlcXVlc3RFbmQsXG4gICAgICAgIHMub3Blbl90cmFuc2FjdGlvbl9jb3VudCBBUyBvcGVuVHJhbnNhY3Rpb25Db3VudCxcbiAgICAgICAgci5zdGF0dXMgQVMgcmVxdWVzdFN0YXR1cyxcbiAgICAgICAgci5jb21tYW5kIEFTIGNvbW1hbmQsXG4gICAgICAgIHIud2FpdF90eXBlIEFTIHdhaXRUeXBlLFxuICAgICAgICByLndhaXRfdGltZSBBUyB3YWl0VGltZU1zLFxuICAgICAgICByLmJsb2NraW5nX3Nlc3Npb25faWQgQVMgYmxvY2tpbmdTZXNzaW9uSWQsXG4gICAgICAgIENBU1QoaWIuZXZlbnRfaW5mbyBBUyBOVkFSQ0hBUihNQVgpKSBBUyBsYXN0U3FsXG4gICAgICBGUk9NIHN5cy5kbV9leGVjX3Nlc3Npb25zIHNcbiAgICAgIExFRlQgSk9JTiBzeXMuZG1fZXhlY19yZXF1ZXN0cyByIE9OIHIuc2Vzc2lvbl9pZCA9IHMuc2Vzc2lvbl9pZFxuICAgICAgT1VURVIgQVBQTFkgc3lzLmRtX2V4ZWNfaW5wdXRfYnVmZmVyKHMuc2Vzc2lvbl9pZCwgTlVMTCkgaWJcbiAgICAgIFdIRVJFIHMuaXNfdXNlcl9wcm9jZXNzID0gMVxuICAgICAgICBBTkQgcy5zZXNzaW9uX2lkIDw+IEBAU1BJRFxuICAgICAgICBBTkQgKHMuc2Vzc2lvbl9pZCBJTiAoU0VMRUNUIHNlc3Npb25faWQgRlJPTSBsb2NrX3Nlc3Npb25zKSBPUiByLmRhdGFiYXNlX2lkID0gREJfSUQoKSlcbiAgICBgKVxuXG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gXCIobm9uZSDigJQgbm8gb3RoZXIgc2Vzc2lvbiBoZWxkIGEgbG9jayBvciByYW4gYSByZXF1ZXN0IGluIHRoaXMgZGF0YWJhc2Ugd2hlbiBxdWVyaWVkKVwiXG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93cywgbnVsbCwgMilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUgc3Fscy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5Ecm9wVGFibGVTcWxBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlU1FMcyh0YWJsZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGRyb3BBcmdzID0gT2JqZWN0LmFzc2lnbih7dGFibGVOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGRyb3BUYWJsZSA9IG5ldyBEcm9wVGFibGUoZHJvcEFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgZHJvcFRhYmxlLnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIHRoYXQgcmVmZXJlbmNlIHRoZSBnaXZlbiB0YWJsZS4gTVNTUUxcbiAgICogcmVmdXNlcyB0byBkcm9wIGEgdGFibGUgdGhhdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IGEgRk9SRUlHTiBLRVlcbiAgICogY29uc3RyYWludCBldmVuIHdoZW4gY29uc3RyYWludHMgYXJlIGRpc2FibGVkIHZpYSBOT0NIRUNLLCBzbyB0aGVcbiAgICogcmVmZXJlbmNpbmcgY29uc3RyYWludHMgbXVzdCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgdGFibGUgY2FuIGJlIGRyb3BwZWQuXG4gICAqIFRoaXMgbGV0cyBjYWxsZXJzIGRyb3AgdGFibGVzIGluIGFueSBvcmRlciAoZS5nLiB3aXBpbmcgYSB3aG9sZSBzY2hlbWEpXG4gICAqIHdpdGhvdXQgZmlyc3QgZHJvcHBpbmcgZXZlcnkgZGVwZW5kZW50IHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kcm9wUmVmZXJlbmNpbmdGb3JlaWduS2V5cyh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgIFwiU0VMRUNUIGZrLm5hbWUgQVMgY29uc3RyYWludF9uYW1lLCBPQkpFQ1RfTkFNRShmay5wYXJlbnRfb2JqZWN0X2lkKSBBUyBwYXJlbnRfdGFibGUgXCIgK1xuICAgICAgYEZST00gc3lzLmZvcmVpZ25fa2V5cyBmayBXSEVSRSBmay5yZWZlcmVuY2VkX29iamVjdF9pZCA9IE9CSkVDVF9JRCgke3RoaXMucXVvdGUodGFibGVOYW1lKX0pYFxuICAgIClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnROYW1lID0gcm93LmNvbnN0cmFpbnRfbmFtZSA/PyByb3cuQ09OU1RSQUlOVF9OQU1FXG4gICAgICBjb25zdCBwYXJlbnRUYWJsZSA9IHJvdy5wYXJlbnRfdGFibGUgPz8gcm93LlBBUkVOVF9UQUJMRVxuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBBTFRFUiBUQUJMRSBbJHtwYXJlbnRUYWJsZX1dIERST1AgQ09OU1RSQUlOVCBbJHtjb25zdHJhaW50TmFtZX1dYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZSh0YWJsZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuX2Fzc2VydE5vdFJlYWRPbmx5KClcbiAgICBhd2FpdCB0aGlzLl9kcm9wUmVmZXJlbmNpbmdGb3JlaWduS2V5cyh0YWJsZU5hbWUpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5kcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHsgcmV0dXJuIFwibXNzcWxcIiB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVlcnkgYWN0dWFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeVJlc3VsdFR5cGU+fSAtIFJlc29sdmVzIHdpdGggdGhlIHF1ZXJ5IGFjdHVhbC5cbiAgICovXG4gIGFzeW5jIF9xdWVyeUFjdHVhbChzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCByZXN1bHRcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IG9wdGlvbnMucmVxdWVzdFRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHtyZXF1ZXN0VGltZW91dDogb3B0aW9ucy5yZXF1ZXN0VGltZW91dE1zfVxuICAgICAgICAvLyBub2RlLW1zc3FsIHN1cHBvcnRzIHJlcXVlc3QtbG9jYWwgb3ZlcnJpZGVzLCBidXQgaXRzIERlZmluaXRlbHlUeXBlZFxuICAgICAgICAvLyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBzdGlsbCBleHBvc2VzIG9ubHkgdGhlIGxlZ2FjeSBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RPcHRpb25zXG4gICAgICAgICAgPyBSZWZsZWN0LmNvbnN0cnVjdChtc3NxbC5SZXF1ZXN0LCBbdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uIHx8IHRoaXMuY29ubmVjdGlvbiwgcmVxdWVzdE9wdGlvbnNdKVxuICAgICAgICAgIDogdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIDogbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuICAgICAgICByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT0gXCJObyBjb25uZWN0aW9uIGlzIHNwZWNpZmllZCBmb3IgdGhhdCByZXF1ZXN0LlwiICYmIHRyaWVzIDw9IDMpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjb25uZWN0aW5nIHRvIGRhdGFiYXNlXCIpXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbm5lY3QoKVxuICAgICAgICAgIC8vIFJldHJ5XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIC8vIFJlLXRocm93IGVycm9yIGJlY2F1c2UgdGhlIHN0YWNrLXRyYWNlIGlzIGJyb2tlbiBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgYXBwLWRldmVsb3BtZW50LlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yLm1lc3NhZ2V9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgJyR7ZXJyb3J9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXN1bHQucmVjb3Jkc2V0cykgPyByZXN1bHQucmVjb3Jkc2V0c1swXSB8fCBbXSA6IFtdXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBtdXRhdGlvbiB3aXRoIGFmZmVjdGVkLXJvdyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIE11dGF0aW9uIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBBZmZlY3RlZCByb3cgY291bnQuXG4gICAqL1xuICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25cbiAgICAgID8gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5fY3VycmVudFRyYW5zYWN0aW9uKVxuICAgICAgOiBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5xdWVyeShzcWwpXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzQWZmZWN0ZWQucmVkdWNlKCh0b3RhbCwgY291bnQpID0+IHRvdGFsICsgY291bnQsIDApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSB0byBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcXVlcnkvaW5kZXguanNcIikuZGVmYXVsdH0gcXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnlUb1NxbChxdWVyeSkgeyByZXR1cm4gbmV3IFF1ZXJ5UGFyc2VyKHtxdWVyeX0pLnRvU3FsKCkgfVxuXG4gIHNob3VsZFNldEF1dG9JbmNyZW1lbnRXaGVuUHJpbWFyeUtleSgpIHsgcmV0dXJuIHRydWUgfVxuICBzdXBwb3J0c0RlZmF1bHRQcmltYXJ5S2V5VVVJRCgpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFuIGV4cGxpY2l0IHByaW1hcnkta2V5IGluc2VydCBhcyBvbmUgYmF0Y2ggcmVxdWVzdDogU1FMIFNlcnZlciBzY29wZXNcbiAgICogSURFTlRJVFlfSU5TRVJUIHRvIHRoZSBzZXNzaW9uLCBhbmQgbm9kZS1tc3NxbCBwb29sLWJhY2tlZCByZXF1ZXN0cyBtYXkgdXNlXG4gICAqIGEgZGlmZmVyZW50IHBoeXNpY2FsIHNlc3Npb24gcGVyIHF1ZXJ5LCBzbyBlbmFibGluZyBpdCBpbiBhIHNlcGFyYXRlIHF1ZXJ5XG4gICAqIGNhbiBsZWF2ZSB0aGUgYWN0dWFsIElOU0VSVCBvbiBhbm90aGVyIHNlc3Npb24uIEEgc2luZ2xlIGJhdGNoIGtlZXBzIHRoZVxuICAgKiB3aG9sZSBzZXF1ZW5jZSBvbiBvbmUgc2Vzc2lvbiBieSBjb25zdHJ1Y3Rpb246IGVuYWJsZSwgaW5zZXJ0LCBkaXNhYmxlIG9uXG4gICAqIHN1Y2Nlc3MsIGFuZCBhIENBVENIIHRoYXQgZGlzYWJsZXMgYW5kIHJldGhyb3dzIHRoZSBvcmlnaW5hbCBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gYXJncy5vcHRpb25zIC0gUXVlcnkgb3B0aW9ucyBmb3IgdGhlIHN0YW5kYXJkIHF1ZXJ5IHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNxbCAtIEdlbmVyYXRlZCBpbnNlcnQgU1FMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBUYWJsZSBiZWluZyBpbnNlcnRlZCBpbnRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gSW5zZXJ0IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGluc2VydFdpdGhFeHBsaWNpdFByaW1hcnlLZXkoe29wdGlvbnMsIHNxbCwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHF1b3RlZFRhYmxlID0gdGhpcy5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICBjb25zdCBiYXRjaCA9IFtcbiAgICAgIGBTRVQgSURFTlRJVFlfSU5TRVJUICR7cXVvdGVkVGFibGV9IE9OO2AsXG4gICAgICBcIkJFR0lOIFRSWVwiLFxuICAgICAgYCR7c3FsfTtgLFxuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT0ZGO2AsXG4gICAgICBcIkVORCBUUllcIixcbiAgICAgIFwiQkVHSU4gQ0FUQ0hcIixcbiAgICAgIGBTRVQgSURFTlRJVFlfSU5TRVJUICR7cXVvdGVkVGFibGV9IE9GRjtgLFxuICAgICAgXCJUSFJPVztcIixcbiAgICAgIFwiRU5EIENBVENIXCJcbiAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KGJhdGNoLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXNjYXBlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZXNjYXBlLlxuICAgKi9cbiAgZXNjYXBlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpXG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogYCR7dmFsdWV9YFxuXG4gICAgY29uc3QgcmVzdWx0V2l0aFF1b3RlcyA9IGVzY2FwZVN0cmluZyhzdHJpbmdWYWx1ZSwgbnVsbClcbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRXaXRoUXVvdGVzLnN1YnN0cmluZygxLCByZXN1bHRXaXRoUXVvdGVzLmxlbmd0aCAtIDEpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IC0gVGhlIHF1b3RlZCB2YWx1ZS5cbiAgICovXG4gIHF1b3RlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSlcblxuICAgIHJldHVybiBgTiR7ZXNjYXBlU3RyaW5nKHN0cmluZ1ZhbHVlLCBudWxsKX1gXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHF1b3RlIGNvbHVtbi5cbiAgICovXG4gIHF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpIHsgcmV0dXJuIHRoaXMub3B0aW9ucygpLnF1b3RlQ29sdW1uTmFtZShjb2x1bW5OYW1lKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVvdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBTdHJpbmcuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHF1b3RlIHRhYmxlLlxuICAgKi9cbiAgcXVvdGVUYWJsZShzdHJpbmcpIHsgcmV0dXJuIHRoaXMub3B0aW9ucygpLnF1b3RlVGFibGVOYW1lKHN0cmluZykgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmFtZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ29sdW1uTmFtZSAtIFByZXZpb3VzIGNvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29sdW1uTmFtZSAtIE5ldyBjb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBFWEVDIHNwX3JlbmFtZSAke3RoaXMucXVvdGUoYCR7dGFibGVOYW1lfS4ke29sZENvbHVtbk5hbWV9YCl9LCAke3RoaXMucXVvdGUobmV3Q29sdW1uTmFtZSl9LCAnQ09MVU1OJ2ApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRGVsZXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgZGVsZXRlU3FsKHt0YWJsZU5hbWUsIGNvbmRpdGlvbnN9KSB7XG4gICAgY29uc3QgZGVsZXRlSW5zdHJ1Y3Rpb24gPSBuZXcgRGVsZXRlKHtjb25kaXRpb25zLCBkcml2ZXI6IHRoaXMsIHRhYmxlTmFtZX0pXG5cbiAgICByZXR1cm4gZGVsZXRlSW5zdHJ1Y3Rpb24udG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IHNxbC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5JbnNlcnRTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBpbnNlcnRTcWwoYXJncykge1xuICAgIGNvbnN0IGluc2VydEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGluc2VydCA9IG5ldyBJbnNlcnQoaW5zZXJ0QXJncylcblxuICAgIHJldHVybiBpbnNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGFibGVzLlxuICAgKi9cbiAgYXN5bmMgZ2V0VGFibGVzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInRhYmxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldEFyZ3MoKT8uc2NoZW1hIHx8IHRoaXMuZ2V0QXJncygpPy5zcWxDb25maWc/Lm9wdGlvbnM/LnNjaGVtYVxuICAgICAgY29uc3Qgc2NoZW1hQ2xhdXNlID0gc2NoZW1hXG4gICAgICAgID8gYCBBTkQgW1RBQkxFX1NDSEVNQV0gPSAke3RoaXMucXVvdGUoc2NoZW1hKX1gXG4gICAgICAgIDogXCIgQU5EIFtUQUJMRV9TQ0hFTUFdID0gU0NIRU1BX05BTUUoKVwiXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBTRUxFQ1QgW1RBQkxFX05BTUVdIEZST00gW0lORk9STUFUSU9OX1NDSEVNQV0uW1RBQkxFU10gV0hFUkUgW1RBQkxFX0NBVEFMT0ddID0gREJfTkFNRSgpJHtzY2hlbWFDbGF1c2V9YClcbiAgICAgIGNvbnN0IHRhYmxlcyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovIChyb3cpKVxuXG4gICAgICAgIHRhYmxlcy5wdXNoKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGVzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgYWxsIGVsaWdpYmxlIHRhYmxlcyBpbiBvbmUgU1FMIFNlcnZlciByZXF1ZXN0LCByZXRhaW5pbmcgdGhlXG4gICAqIHJlY29nbml6ZWQgZm9yZWlnbi1rZXkgZmFsbGJhY2sgdXNlZCBieSB0aGUgcGVyLXRhYmxlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4uL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdD59IHRhYmxlcyAtIEVsaWdpYmxlIHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgYmF0Y2ggY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgdHJ1bmNhdGVUYWJsZXModGFibGVzKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgY29uc3QgcXVvdGVkVGFibGUgPSB0aGlzLnF1b3RlVGFibGUodGFibGUuZ2V0TmFtZSgpKVxuXG4gICAgICBzdGF0ZW1lbnRzLnB1c2goXG4gICAgICAgIFwiQkVHSU4gVFJZXCIsXG4gICAgICAgIGAgIFRSVU5DQVRFIFRBQkxFICR7cXVvdGVkVGFibGV9O2AsXG4gICAgICAgIFwiRU5EIFRSWVwiLFxuICAgICAgICBcIkJFR0lOIENBVENIXCIsXG4gICAgICAgIFwiICBJRiBFUlJPUl9OVU1CRVIoKSA9IDQ3MTJcIixcbiAgICAgICAgXCIgIEJFR0lOXCIsXG4gICAgICAgIGAgICAgREVMRVRFIEZST00gJHtxdW90ZWRUYWJsZX07YCxcbiAgICAgICAgXCIgIEVORFwiLFxuICAgICAgICBcIiAgRUxTRVwiLFxuICAgICAgICBcIiAgQkVHSU5cIixcbiAgICAgICAgXCIgICAgVEhST1c7XCIsXG4gICAgICAgIFwiICBFTkRcIixcbiAgICAgICAgXCJFTkQgQ0FUQ0g7XCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KHN0YXRlbWVudHMuam9pbihcIlxcblwiKSlcbiAgfVxuXG4gIGFzeW5jIGxhc3RJbnNlcnRJRChvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIFNDT1BFX0lERU5USVRZKCkgQVMgbGFzdF9pbnNlcnRfaWRcIiwgb3B0aW9ucylcbiAgICBjb25zdCBsYXN0SW5zZXJ0SUQgPSBkaWdnKHJlc3VsdCwgMCwgXCJsYXN0X2luc2VydF9pZFwiKVxuXG4gICAgaWYgKGxhc3RJbnNlcnRJRCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZ2V0IHRoZSBsYXN0IGluc2VydGVkIElEXCIpXG5cbiAgICByZXR1cm4gbGFzdEluc2VydElEXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7T3B0aW9uc30gLSBUaGUgb3B0aW9ucyBvcHRpb25zLlxuICAgKi9cbiAgb3B0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMpIHRoaXMuX29wdGlvbnMgPSBuZXcgT3B0aW9ucyh7ZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25zXG4gIH1cblxuICBhc3luYyBfc3RhcnRUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICBhd2FpdCB0aGlzLl9ydW5QaHlzaWNhbENvbm5lY3Rpb25SZXF1ZXN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkEgdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBydW5uaW5nXCIpXG4gICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IG1zc3FsLlRyYW5zYWN0aW9uKHRoaXMuY29ubmVjdGlvbilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uLmJlZ2luKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgX2NvbW1pdFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgIGF3YWl0IHRoaXMuX3J1blBoeXNpY2FsQ29ubmVjdGlvblJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkEgdHJhbnNhY3Rpb24gaXNuJ3QgcnVubmluZ1wiKVxuXG4gICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24uY29tbWl0KClcbiAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgX3JvbGxiYWNrVHJhbnNhY3Rpb25BY3Rpb24oKSB7XG4gICAgYXdhaXQgdGhpcy5fcnVuUGh5c2ljYWxDb25uZWN0aW9uUmVxdWVzdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkEgdHJhbnNhY3Rpb24gaXNuJ3QgcnVubmluZyAtIGlnbm9yaW5nIGJlY2F1c2UgdGhhdCBjYW4gaGFwcGVuIGlmIHNvbWV0aGluZyBlbHNlIGhhcyBmYWlsZWQgaW4gdGhlIGRiXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24ucm9sbGJhY2soKVxuICAgICAgfSBjYXRjaCAodHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFdoZW4gU1FMIFNlcnZlciBoYXMgYWxyZWFkeSBhYm9ydGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiwgYVxuICAgICAgICAvLyBzdGFsZSBjb25jdXJyZW50IHJlcXVlc3QgdHJpZ2dlcmVkIFhBQ1RfQUJPUlQpLCB0aGVcbiAgICAgICAgLy8gbXNzcWwuVHJhbnNhY3Rpb24ucm9sbGJhY2soKSBjYWxsIGZhaWxzIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIFRyYW5zYWN0aW9uIG9iamVjdCBpcyBkZWFkLiAgSXNzdWUgYSByYXcgUk9MTEJBQ0sgb24gdGhlXG4gICAgICAgIC8vIHVuZGVybHlpbmcgY29ubmVjdGlvbiB0byBjbGVhciBTUUwgU2VydmVyJ3Mgc2Vzc2lvbi1sZXZlbFxuICAgICAgICAvLyBhYm9ydGVkLXRyYW5zYWN0aW9uIHN0YXRlIHNvIHRoZSBjb25uZWN0aW9uIGlzIHVzYWJsZSBmb3IgdGhlXG4gICAgICAgIC8vIG5leHQgQkVHSU4gVFJBTlNBQ1RJT04uXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUcmFuc2FjdGlvbi5yb2xsYmFjaygpIGZhaWxlZCwgY2xlYXJpbmcgc2Vzc2lvbiBzdGF0ZSB3aXRoIHJhdyBST0xMQkFDS1wiLCB7XG4gICAgICAgICAgZXJyb3I6IHRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gdHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yLm1lc3NhZ2UgOiB0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3JcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICAgIGF3YWl0IHJlcXVlc3QucXVlcnkoXCJJRiBAQFRSQU5DT1VOVCA+IDAgUk9MTEJBQ0tcIilcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQgc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtvcHRpb25zXSAtIFRyYW5zYWN0aW9uIG93bmVyc2hpcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9zdGFydFNhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBTQVZFIFRSQU5TQUNUSU9OIFske3NhdmVQb2ludE5hbWV9XWAsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxlYXNlIHNhdmUgcG9pbnQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2F2ZVBvaW50TmFtZSAtIFNhdmUgcG9pbnQgbmFtZS5cbiAgICogQHBhcmFtIHtQaWNrPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zLCBcIm9wZXJhdGlvbk93bmVyXCI+fSBbX29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlbGVhc2VTYXZlUG9pbnRBY3Rpb24oc2F2ZVBvaW50TmFtZSwgX29wdGlvbnMgPSB7fSkge1xuICAgIC8vIERvIG5vdGhpbmcgaW4gTVMtU1FMLlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm9sbGJhY2sgc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtvcHRpb25zXSAtIFRyYW5zYWN0aW9uIG93bmVyc2hpcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9yb2xsYmFja1NhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShgUk9MTEJBQ0sgVFJBTlNBQ1RJT04gWyR7c2F2ZVBvaW50TmFtZX1dYCwgb3B0aW9ucylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYCR7ZXJyb3J9YFxuXG4gICAgICAvLyBXaGVuIFhBQ1RfQUJPUlQga2lsbHMgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiwgdGhlIHNhdmVwb2ludFxuICAgICAgLy8gbm8gbG9uZ2VyIGV4aXN0cyBhbmQgdGhlIFJPTExCQUNLIFRSQU5TQUNUSU9OIFtuYW1lXSBmYWlscy5cbiAgICAgIC8vIElzc3VlIGEgcmF3IElGIEBAVFJBTkNPVU5UID4gMCBST0xMQkFDSyB0byBjbGVhciB3aGF0ZXZlclxuICAgICAgLy8gc2Vzc2lvbiBzdGF0ZSByZW1haW5zLCB0aGVuIGxldCB0aGUgZXJyb3IgcHJvcGFnYXRlIHNvIHRoZVxuICAgICAgLy8gb3V0ZXIgdHJhbnNhY3Rpb24oKSBjYWxsIGtub3dzIHRoZSB0cmFuc2FjdGlvbiBpcyBkZWFkLlxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJUcmFuc2FjdGlvbiBoYXMgbm90IGJlZ3VuXCIpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoXCJUcmFuc2FjdGlvbiBoYXMgYmVlbiBhYm9ydGVkXCIpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiU2F2ZXBvaW50IHJvbGxiYWNrIGZhaWxlZDsgdHJhbnNhY3Rpb24gYWxyZWFkeSBkZWFkLCBjbGVhcmluZyBzZXNzaW9uIHN0YXRlXCIpXG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuY29ubmVjdGlvbilcblxuICAgICAgICBhd2FpdCByZXF1ZXN0LnF1ZXJ5KFwiSUYgQEBUUkFOQ09VTlQgPiAwIFJPTExCQUNLXCIpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVTYXZlUG9pbnROYW1lKCkge1xuICAgIHJldHVybiBgc3Ake25ldyBVVUlEKDQpLmZvcm1hdCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpfWAuc3Vic3RyaW5nKDAsIDMyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXBkYXRlIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlVwZGF0ZVNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHVwZGF0ZVNxbCh7Y29uZGl0aW9ucywgZGF0YSwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGUoe2NvbmRpdGlvbnMsIGRhdGEsIGRyaXZlcjogdGhpcywgdGFibGVOYW1lfSlcblxuICAgIHJldHVybiB1cGRhdGUudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXBzZXJ0IHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlVwc2VydFNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHVwc2VydFNxbChhcmdzKSB7XG4gICAgY29uc3QgdXBzZXJ0ID0gbmV3IFVwc2VydCh7Li4uYXJncywgZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB1cHNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RydWN0dXJlIHNxbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RydWN0dXJlU3FsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInN0cnVjdHVyZVNxbFwiLCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgU3RydWN0dXJlU3FsKHtkcml2ZXI6IHRoaXN9KS50b1NxbCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCBhIFNRTCBTZXJ2ZXIgYXBwbGljYXRpb24gbG9jayBpcyBhY3F1aXJlZCBvbiB0aGlzXG4gICAqIGNvbm5lY3Rpb24gdmlhIGBzcF9nZXRhcHBsb2NrYC4gVGhlIFNlc3Npb24gbG9jayBvd25lciBzY29wZXMgdGhlIGxvY2tcbiAgICogdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbiwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rpb24tc2NvcGVkIHNlbWFudGljcyBvblxuICAgKiBNeVNRTCBhbmQgUG9zdGdyZVNRTC5cbiAgICpcbiAgICogYHNwX2dldGFwcGxvY2tgIHJldHVybnMgMCBvbiBpbW1lZGlhdGUgZ3JhbnQsIDEgYWZ0ZXIgd2FpdGluZywgYW5kXG4gICAqIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlICh0aW1lb3V0LCBkZWFkbG9jaywgY2FuY2VsZWQsIHBhcmFtZXRlclxuICAgKiBlcnJvcikuIFdlIHRyZWF0IDAvMSBhcyBzdWNjZXNzIGFuZCAtMSAodGltZW91dCkgYXMgYSBjbGVhbiBgZmFsc2VgO1xuICAgKiBhbnl0aGluZyBlbHNlIHRocm93cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBbYXJnc10gLSBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kczsgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgbmVnYXRpdmUgYmxvY2tzIGZvcmV2ZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGFjcXVpcmVkLCBmYWxzZSBpZiB0aGUgdGltZW91dCBlbGFwc2VkLlxuICAgKi9cbiAgYXN5bmMgX2FjcXVpcmVBZHZpc29yeUxvY2sobmFtZSwge3RpbWVvdXRNc30gPSB7fSkge1xuICAgIGNvbnN0IHRpbWVvdXRWYWx1ZSA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDAgPyBNYXRoLmNlaWwodGltZW91dE1zKSA6IC0xXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuX2Fkdmlzb3J5TG9ja1F1ZXJ5KFxuICAgICAgYERFQ0xBUkUgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBJTlQ7IEVYRUMgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCA9IHNwX2dldGFwcGxvY2sgQFJlc291cmNlID0gJHt0aGlzLnF1b3RlKG5hbWUpfSwgQExvY2tNb2RlID0gJ0V4Y2x1c2l2ZScsIEBMb2NrT3duZXIgPSAnU2Vzc2lvbicsIEBMb2NrVGltZW91dCA9ICR7dGltZW91dFZhbHVlfTsgU0VMRUNUIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgQVMgdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0YFxuICAgIClcbiAgICBjb25zdCByZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQpXG5cbiAgICBpZiAocmVzdWx0ID09PSAwIHx8IHJlc3VsdCA9PT0gMSkgcmV0dXJuIHRydWVcblxuICAgIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gLTEpIHJldHVybiBmYWxzZVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcF9nZXRhcHBsb2NrIHJldHVybmVkICR7cmVzdWx0fSBmb3IgYWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSAoc2VlIFNRTCBTZXJ2ZXIgZG9jdW1lbnRhdGlvbiBmb3Igc3BfZ2V0YXBwbG9jayByZXR1cm4gY29kZXMpYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRyeSBhY3F1aXJlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZCwgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgaGVsZC5cbiAgICovXG4gIGFzeW5jIF90cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zOiAwfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGVhc2UgYWR2aXNvcnkgbG9jay5cbiAgICpcbiAgICogYHNwX3JlbGVhc2VhcHBsb2NrYCByZXR1cm5zIDAgd2hlbiB0aGUgbG9jayB3YXMgcmVsZWFzZWQsIGJ1dCBTUUwgU2VydmVyXG4gICAqIHJhaXNlcyBlcnJvciB7QGxpbmsgQVBQTE9DS19OT1RfSEVMRF9FUlJPUl9OVU1CRVJ9IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFcbiAgICogZmFpbHVyZSBjb2RlIHdoZW4gdGhlIHNlc3Npb24gZG9lcyBub3QgY3VycmVudGx5IGhvbGQgdGhlIGxvY2suIFRoYXRcbiAgICogZXJyb3IgYWJvcnRzIHRoZSBiYXRjaCBiZWZvcmUgdGhlIHRyYWlsaW5nIGBTRUxFQ1RgIGNhbiBydW4sIHNvIHdlIGNhdGNoXG4gICAqIGl0IGFuZCByZXNvbHZlIHRvIGBmYWxzZWAgdG8gaG9ub3IgdGhlIGNyb3NzLWRyaXZlciBjb250cmFjdCBmb3IgYW5cbiAgICogYWxyZWFkeS11bmhlbGQgbG9jay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGhlbGQgYnkgdGhpcyBzZXNzaW9uIGFuZCBoYXMgbm93IGJlZW4gcmVsZWFzZWQuXG4gICAqL1xuICBhc3luYyBfcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKSB7XG4gICAgbGV0IHJvd3NcblxuICAgIHRyeSB7XG4gICAgICByb3dzID0gYXdhaXQgdGhpcy5fYWR2aXNvcnlMb2NrUXVlcnkoXG4gICAgICAgIGBERUNMQVJFIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgSU5UOyBFWEVDIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgPSBzcF9yZWxlYXNlYXBwbG9jayBAUmVzb3VyY2UgPSAke3RoaXMucXVvdGUobmFtZSl9LCBATG9ja093bmVyID0gJ1Nlc3Npb24nOyBTRUxFQ1QgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgXG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FwcGxvY2tOb3RIZWxkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25JZkZpbmFsUmVsZWFzZSgpXG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gTnVtYmVyKHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0KVxuXG4gICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKClcblxuICAgIHJldHVybiByZXN1bHQgPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFuIGFkdmlzb3J5LWxvY2sgc3RhdGVtZW50IHRocm91Z2ggb25lIHRyYW5zYWN0aW9uIHJlcXVlc3QgcGFyZW50LlxuICAgKiBub2RlLW1zc3FsIHJlc2VydmVzIG9uZSBwaHlzaWNhbCBzZXNzaW9uIGZvciBhIFRyYW5zYWN0aW9uLCB3aGVyZWFzXG4gICAqIHNlcGFyYXRlIENvbm5lY3Rpb25Qb29sIHJlcXVlc3RzIG1heSBjaGVjayBvdXQgZGlmZmVyZW50IHNlc3Npb25zLiBUaGVcbiAgICogdHJhbnNhY3Rpb24gY29udGFpbnMgb25seSBhcHBsaWNhdGlvbi1sb2NrIHN0YXRlbWVudHM7IGNhbGxlci9tb2RlbCB3b3JrXG4gICAqIGNvbnRpbnVlcyB0aHJvdWdoIGl0cyBvcmlnaW5hbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gQWR2aXNvcnktbG9jayBTUUwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBSZXN1bHQgcm93cy5cbiAgICovXG4gIGFzeW5jIF9hZHZpc29yeUxvY2tRdWVyeShzcWwpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuX2Vuc3VyZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodHJhbnNhY3Rpb24pXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0LnJlY29yZHNldHMpID8gcmVzdWx0LnJlY29yZHNldHNbMF0gfHwgW10gOiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvci5tZXNzYWdlfSc6ICR7c3FsfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvcn0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IHBhcmVudCB0aGF0IHJlc2VydmVzIHRoZSBhZHZpc29yeS1sb2NrXG4gICAqIHNlc3Npb24gdW50aWwgdGhlIGZpbmFsIHJlbGVhc2Ugb3IgZHJpdmVyIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJtc3NxbFwiKS5UcmFuc2FjdGlvbj59IC0gU2Vzc2lvbi1hZmZpbmUgcGFyZW50LlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbikgcmV0dXJuIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIk1TU1FMIGNvbm5lY3Rpb24gdW5hdmFpbGFibGUgZm9yIGFkdmlzb3J5IGxvY2tcIilcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IG1zc3FsLlRyYW5zYWN0aW9uKHRoaXMuY29ubmVjdGlvbilcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLmJlZ2luKClcbiAgICB0aGlzLl9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgcmVzZXJ2ZWQgc2Vzc2lvbiBhZnRlciB0aGUgbGFzdCB0cmFja2VkIGxvY2sgcmVsZWFzZS5cbiAgICogQmFzZSB1bnRyYWNrcyB0aGUgY3VycmVudCByZWxlYXNlIGFmdGVyIHRoZSBkcml2ZXIgaG9vayByZXR1cm5zLCBzbyBhXG4gICAqIGN1cnJlbnQgdG90YWwgb2Ygb25lIG1lYW5zIHRoaXMgaXMgdGhlIGZpbmFsIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGNsZWFudXAgd2hlbiB0aGlzIGlzIGZpbmFsLlxuICAgKi9cbiAgYXN5bmMgX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25JZkZpbmFsUmVsZWFzZSgpIHtcbiAgICBsZXQgaGVsZENvdW50ID0gMFxuXG4gICAgZm9yIChjb25zdCBjb3VudCBvZiB0aGlzLl9oZWxkQWR2aXNvcnlMb2Nrcy52YWx1ZXMoKSkgaGVsZENvdW50ICs9IGNvdW50XG5cbiAgICBpZiAoaGVsZENvdW50IDw9IDEpIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxzIGJhY2sgdGhlIG90aGVyd2lzZS1lbXB0eSB0cmFuc2FjdGlvbiBhbmQgcmV0dXJucyBpdHMgcGh5c2ljYWxcbiAgICogc2Vzc2lvbiB0byBub2RlLW1zc3FsLiBSb2xsYmFjayBpcyBjbGVhbnVwIG9ubHk7IGFkdmlzb3J5IGxvY2tzIGFyZVxuICAgKiBleHBsaWNpdGx5IHJlbGVhc2VkIGZpcnN0IHdoZW5ldmVyIHRoZWlyIHJlbGVhc2Ugc3RhdGVtZW50IHN1Y2NlZWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBzZXNzaW9uIGNsZWFudXAuXG4gICAqL1xuICBhc3luYyBfY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uXG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uID0gbnVsbFxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJvbGxiYWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIHRoZSBTUUwgU2VydmVyIFwiYXBwbGljYXRpb24gbG9jayBpcyBub3QgY3VycmVudGx5IGhlbGRcIiBlcnJvclxuICAgKiByYWlzZWQgYnkgYHNwX3JlbGVhc2VhcHBsb2NrYC4gSXQgd2Fsa3MgdGhlIHdyYXBwZWQtZXJyb3IgY2F1c2UgY2hhaW5cbiAgICogYmVjYXVzZSBgcXVlcnlgIHJlLXdyYXBzIHRoZSBkcml2ZXIncyBgUmVxdWVzdEVycm9yYCBpbiBhIHBsYWluIGBFcnJvcmAsXG4gICAqIGFuZCBtYXRjaGVzIG9uIHRoZSBzdGFibGUgbnVtZXJpYyBlcnJvciBudW1iZXIgcmF0aGVyIHRoYW4gdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBFcnJvciB0aHJvd24gd2hpbGUgcmVsZWFzaW5nIHRoZSBsb2NrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBlcnJvciBtZWFucyB0aGUgbG9jayB3YXMgbm90IGhlbGQgYnkgdGhpcyBzZXNzaW9uLlxuICAgKi9cbiAgX2lzQXBwbG9ja05vdEhlbGRFcnJvcihlcnJvcikge1xuICAgIGxldCBjdXJyZW50ID0gZXJyb3JcblxuICAgIHdoaWxlIChjdXJyZW50IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTnVtYmVyID0gLyoqIEB0eXBlIHt7bnVtYmVyPzogdW5rbm93bn19ICovIChjdXJyZW50KS5udW1iZXJcblxuICAgICAgaWYgKHR5cGVvZiBlcnJvck51bWJlciA9PT0gXCJudW1iZXJcIiAmJiBlcnJvck51bWJlciA9PT0gQVBQTE9DS19OT1RfSEVMRF9FUlJPUl9OVU1CRVIpIHJldHVybiB0cnVlXG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNhdXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBzZXNzaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgYXBwbGljYXRpb24gbG9jay5cbiAgICpcbiAgICogVGhpcyBjb21iaW5lcyB0d28gcHJvYmVzIGJlY2F1c2UgbmVpdGhlciBpcyBzdWZmaWNpZW50IG9uIGl0cyBvd246XG4gICAqICAgLSBgQVBQTE9DS19NT0RFKC4uLiwgJ1Nlc3Npb24nKWAgb25seSByZXBvcnRzIGxvY2tzIGhlbGQgYnkgdGhlXG4gICAqICAgICAqKmN1cnJlbnQqKiBzZXNzaW9uLCBzbyBpdCBtaXNzZXMgbG9ja3MgaGVsZCBieSBhbnkgb3RoZXJcbiAgICogICAgIHNlc3Npb24gYW5kIHdvdWxkIHJldHVybiBgTm9Mb2NrYCBldmVuIHVuZGVyIGNyb3NzLXNlc3Npb25cbiAgICogICAgIGNvbnRlbnRpb24uXG4gICAqICAgLSBgQVBQTE9DS19URVNUKC4uLiwgJ0V4Y2x1c2l2ZScsICdTZXNzaW9uJylgIHJldHVybnMgd2hldGhlciBhblxuICAgKiAgICAgRXhjbHVzaXZlIGxvY2sgY291bGQgYmUgZ3JhbnRlZCB0byAqdGhpcyogc2Vzc2lvbiByaWdodCBub3cuIEFcbiAgICogICAgIHJldHVybiB2YWx1ZSBvZiAwIG1lYW5zIHNvbWVib2R5IGVsc2UgaG9sZHMgYW4gaW5jb21wYXRpYmxlXG4gICAqICAgICBsb2NrOyBhIHZhbHVlIG9mIDEgbWVhbnMgaXQgaXMgZWl0aGVyIGZyZWUgKipvcioqIGFscmVhZHkgaGVsZFxuICAgKiAgICAgYnkgdXMgcmUtZW50cmFudGx5ICh3aGljaCB0aGUgYEFQUExPQ0tfTU9ERWAgY2hlY2sgY2F0Y2hlcykuXG4gICAqXG4gICAqIFRoZSBjb21iaW5lZCByZXN1bHQgaXMgXCJoZWxkXCIgaWZmIHdlIGhvbGQgaXQgb3Vyc2VsdmVzIG9yXG4gICAqIGBBUFBMT0NLX1RFU1RgIHJlcG9ydHMgd2UgY2Fubm90IGFjcXVpcmUgaXQgd2l0aG91dCB3YWl0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiBhbnkgc2Vzc2lvbiBjdXJyZW50bHkgaG9sZHMgdGhlIGxvY2suXG4gICAqL1xuICBhc3luYyBpc0Fkdmlzb3J5TG9ja0hlbGQobmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgYFNFTEVDVCBgICtcbiAgICAgICAgYEFQUExPQ0tfTU9ERSgncHVibGljJywgJHt0aGlzLnF1b3RlKG5hbWUpfSwgJ1Nlc3Npb24nKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfc2VsZl9tb2RlLCBgICtcbiAgICAgICAgYEFQUExPQ0tfVEVTVCgncHVibGljJywgJHt0aGlzLnF1b3RlKG5hbWUpfSwgJ0V4Y2x1c2l2ZScsICdTZXNzaW9uJykgQVMgdmVsb2Npb3VzX2Fkdmlzb3J5X3Rlc3RfcmVzdWx0YFxuICAgIClcbiAgICBjb25zdCBzZWxmTW9kZSA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X3NlbGZfbW9kZVxuICAgIGNvbnN0IGhlbGRCeVNlbGYgPSB0eXBlb2Ygc2VsZk1vZGUgPT09IFwic3RyaW5nXCIgJiYgc2VsZk1vZGUubGVuZ3RoID4gMCAmJiBzZWxmTW9kZSAhPT0gXCJOb0xvY2tcIlxuXG4gICAgaWYgKGhlbGRCeVNlbGYpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCB0ZXN0UmVzdWx0ID0gTnVtYmVyKHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X3Rlc3RfcmVzdWx0KVxuXG4gICAgcmV0dXJuIHRlc3RSZXN1bHQgPT09IDBcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"AAUA,OAAO,aAAa,MAAM,YAAY,CAAA;AAGtC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAcxC,YAA6U,uBAAuB,CAD3S,EAAE,SAAhD,cAAc,oBAAoB,EAAE,OAAO,GAAM,cAAc,oBAAoB,EAAE,OAAQ,IAC9F,OAAO,YAAY,EAAE,aAAa,GAAG;IAAC,UAAU,EAAE,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,mBAAmB,EAAE,OAAO,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,iBAAiB,EAAE,cAAc,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,iBAAiB,EAAE,cAAc,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAA;CAAC,CAAyB;AA+JvW;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,qCAAqC,CAFE,EAAE,SAAhD,cAAc,oBAAoB,EAAE,OAAO,GAAM,cAAc,oBAAoB,EAAE,OAAQ,CAEhD,SAAQ,aAAa;IAa5E;;oBAEgB;IACX,UAAU,EADL,EAAE;IAGZ;;0BAEsB;IACjB,aAAa,EADR,MAAM,EAAE;IAEb,YAAY;IACZ,sBAAsB;IACtB,UAAU;IAEf;;4DAEwD;IACnD,UAAU,EADL,OAAO,iBAAiB,EAAE,cAAc,EAAE;IAGpD;;4DAEwD;IACnD,UAAU,EADL,OAAO,iBAAiB,EAAE,cAAc,EAAE;IAhCtD;;;OAGG;IACH,YAAY,IAAI,EAFL,uBAAuB,CAAC,EAAE,CAErB,EA8Bf;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAgChB;IAED;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAHH,OAAO,iBAAiB,EAAE,aAGvB,GAFD,IAAI,CAQhB;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAI,EAHH,OAAO,iBAAiB,EAAE,aAGvB,GAFD,IAAI,CAQhB;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,GAAG,IAAI,EAHN,MAAM,EAGA,GAFP,MAAM,CAIlB;IAED;;;OAGG;IACG,KAAK,IAFE,OAAO,CAAC,MAAM,CAAC,CA6D3B;IAED;;;OAGG;IACG,cAAc,IAFP,OAAO,CAAC,MAAM,CAAC,CAmB3B;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAHF,OAAO,YAAY,EAAE,kBAGnB,GAFA,IAAI,CAmChB;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAHR,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGxB,GAFN,IAAI,CAMhB;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,MAAM,EAJf,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAIR,EAAE,MAAM,EAHvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGT,GAFrB,IAAI,CAYhB;IAED;;;OAGG;IACH,kBAAkB,IAFL,MAAM,CAiBlB;IAED;;;OAGG;IACH,aAAa,IAFA,EAAE,CAMd;IAED;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAHd,cAAc,oBAAoB,EAAE,OAGtB,GAFZ,cAAc,oBAAoB,EAAE,OAAO,CAIvD;IAED;;;OAGG;IACH,eAAe,IAFF,MAAM,EAAE,CAIpB;IAED;;;OAGG;IACH,cAAc,IAFD,OAAO,mBAAmB,EAAE,OAAO,CAI/C;IAED;;;OAGG;IACH,wBAAwB,IAFX,OAAO,CAInB;IAED;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAHjB,MAAM,EAGW,GAFf,IAAI,CAKhB;IAED;;;;OAIG;IACH,YAAY,CAAC,YAAY,EAHd,MAAM,EAGQ,GAFZ,qCAAqC,CAAC,EAAE,CAAC,CASrD;IAED;;;;OAIG;IACH,4BAA4B,CAAC,IAAI,EAHtB,MAAM,EAGgB,GAFpB,MAAM,CAIlB;IAED;;;;OAIG;IACH,6BAA6B,CAAC,IAAI,EAHvB,MAAM,EAGiB,GAFrB,cAAc,oBAAoB,EAAE,OAAO,CAiBvD;IAED;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAHX,MAAM,EAGK,GAFT;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,CAM1D;IAED;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAHf,MAAM,EAGS,GAFb,MAAM,CAMlB;IAED;;;;OAIG;IACH,wBAAwB,CAAC,GAAG,IAAI,EAHlB,MAAM,EAGY,GAFnB,MAAM,CAMlB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,IAAI,EAHT,MAAM,EAGG,GAFV,MAAM,CAIlB;IAED;;;;;OAKG;IACH,KAAK,CAAC,qBAAqB,EAJhB,OAAO,4BAA4B,EAAE,oBAAoB,GAAG,MAAM,GAAG,MAAM,EAI3D,EAAE,oBAAoB,AAH9C,CACA,EADQ,OAAO,4BAA4B,EAAE,oBAGC,GAFpC,IAAI,CAehB;IAED;;;;OAIG;IACH,eAAe,CAAC,eAAe,EAHpB,OAAO,4BAA4B,EAAE,oBAGjB,GAFlB,IAAI,CAqBhB;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAC,QAAQ,EAAE,eAAe,EAAC,EAJ5C;QAAuB,QAAQ,EAAvB,MAAM,EAAE,CAChB;QAAwE,eAAe,EAA/E,OAAO,4BAA4B,EAAE,oBAAoB,CACjE;KAE4C,GAFlC,IAAI,CAyDhB;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,gBAAgB,EAJzB,cAAc,oBAAoB,EAAE,OAIX,EAAE,QAAQ,EAHnC,MAAM,EAG6B,GAFjC,qCAAqC,CAAC,EAAE,CAAC,CAcrD;IAED;;;OAGG;IACG,UAAU,IAFH,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;;OAMG;IACG,SAAS,CAAC,IAAI,EAHT,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGnC,GAFP,OAAO,CAAC,IAAI,CAAC,CAiCzB;IAED;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAHR,OAAO,kCAAkC,EAAE,oBAGnC,GAFN,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAqBrC;IAED;;;;OAIG;IACG,MAAM,CAAC,UAAU,EAHZ;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAGnB,GAFV,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAQ5C;IAED;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAJpB;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAIX,EAAE,QAAQ,AAHtC,CACA,EADQ,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,IAGG,GAF5B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAUrC;IAED;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAHlB;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAGb,GAFhB,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAUrC;IAED;;;;;OAKG;IACG,kBAAkB,CAAC,UAAU,EAJxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAIpB,EAAE,QAAQ,AAH1C,CACA,EADQ,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,IAGO,GAFhC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAcrC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,AAHb,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGlC,GAFR,YAAY,CAAC,EAAE,CAAC,CAS5B;IAED;;;;OAIG;IACG,MAAM,CAAC,UAAU,AAHpB,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAG3B,GAFf,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAQrC;IAED;;;OAGG;IACG,KAAK,IAFE,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAO5C;IAED;;;OAGG;IACG,IAAI,IAFG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAM5C;IAED;;;;OAIG;IACH,qBAAqB,CAAC,SAAS,EAHpB,KAAK,GAAG,MAGY,GAFlB,MAAM,CAUlB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAHD,OAAO,YAAY,EAAE,mBAAmB,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,mBAAmB,CAG1G,GAFC,IAAI,CAMhB;IAED;;;OAGG;IACG,IAAI,IAFG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAgD5C;IAED;;;OAGG;IACG,OAAO,IAFA,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAI5C;IAED;;;;OAIG;IACG,KAAK,CAAC,GAAG,OAAO,EAHX,CAAG,MAAM,GAAC,MAAM,EAAE,GAGP,GAFT,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAmCzD;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAHA,OAAO,YAAY,EAAE,iBAGrB,GAFE,IAAI,CAiChB;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAHH,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGzC,GAFD,IAAI,CAiBhB;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAHH,OAAO,YAAY,EAAE,iBAGlB,GAFD,IAAI,CAiChB;IAED;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAHX,MAGW,GAFT,MAAM,CAIlB;IAED;;;OAGG;IACG,IAAI,IAFG,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAIlD;IAED;;;OAGG;IACG,MAAM,IAFC,OAAO,CAAC,IAAI,CAAC,CAIzB;CACF"}
1
+ {"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"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"}