badmfck-api-server 2.7.3 → 2.7.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -88,7 +88,7 @@ async function Initializer(services) {
88
88
  exports.Initializer = Initializer;
89
89
  class APIService extends BaseService_1.BaseService {
90
90
  static nextLogID = 0;
91
- version = "2.7.3";
91
+ version = "2.7.5";
92
92
  options;
93
93
  monitor;
94
94
  monitorIndexFile;
@@ -510,4 +510,4 @@ class APIService extends BaseService_1.BaseService {
510
510
  }
511
511
  }
512
512
  exports.APIService = APIService;
513
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVBJU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvQVBJU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsZ0RBQXVCO0FBRXZCLGlEQUE0RDtBQUM1RCw0RUFBc0U7QUFFdEUsbURBQWtDO0FBQ2xDLDZDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsZ0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1Qiw0Q0FBbUI7QUFDbkIsNEVBQTJDO0FBQzNDLDRDQUFtQjtBQUNuQixnREFBNEM7QUFDNUMsa0RBQThDO0FBQzlDLGdEQUF1QjtBQUN2QixpREFBNkM7QUFFN0MsK0NBQTJDO0FBQzNDLGdGQUE0RTtBQW1DNUUsU0FBZ0IsaUJBQWlCO0lBQ2hDLE9BQU87UUFDTixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxPQUFPO1FBQ3JCLGlCQUFpQixFQUFFO1lBQ2xCLHVCQUF1QjtTQUN2QjtRQUNELFNBQVMsRUFBRSxFQUFFO1FBQ2IsU0FBUyxFQUFDLE1BQU07UUFDaEIsWUFBWSxFQUFFLFVBQVUsR0FBNkI7WUFDcEQsSUFBQSxvQkFBTyxFQUFDLGtCQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLENBQUM7UUFDRCxPQUFPLEVBQUMsVUFBUyxHQUFPO1lBQ3ZCLElBQUEscUJBQVEsRUFBQyxrQkFBa0IsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsdUJBQXVCLEVBQUMsS0FBSztRQUM3QixTQUFTLEVBQUMsRUFBRSxHQUFDLElBQUksR0FBQyxJQUFJO1FBQ3RCLFdBQVcsRUFBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxhQUFhLENBQUM7S0FDbkQsQ0FBQTtBQUNGLENBQUM7QUFuQkQsOENBbUJDO0FBRVksUUFBQSxrQkFB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QWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUM7WUFDM0IsSUFBRyxDQUFDLE1BQU07Z0JBQ1QsTUFBTSxHQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqQixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBQztnQkFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUcsTUFBTSxJQUFFLENBQUMsRUFBQztvQkFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUMsYUFBYSxHQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNyRixNQUFNO2lCQUNOO2FBQ0Q7U0FDRDtRQUNELE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQztJQUN2QixDQUFDOztBQWhoQkYsZ0NBa2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzLCB7IEFwcGxpY2F0aW9uLCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9CYXNlU2VydmljZSdcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgQmFzZUVuZHBvaW50LCBJQmFzZUVuZHBvaW50IH0gZnJvbSAnLi9CYXNlRW5kcG9pbnQnXG5pbXBvcnQgRGVmYXVsdEVycm9ycywgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnMnXG5pbXBvcnQgeyBIVFRQUmVxdWVzdFZPLCBJRXJyb3IsIFRyYW5zZmVyUGFja2V0Vk8gfSBmcm9tICcuL3N0cnVjdHVyZXMvSW50ZXJmYWNlcydcbmltcG9ydCB7UmVxfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIlxuaW1wb3J0IHsgbG9nQ3JpdCwgbG9nRXJyb3IsIGxvZ0luZm8gfSBmcm9tICcuL0xvZ1NlcnZpY2UnXG5pbXBvcnQgeyBNb25pdG9yIH0gZnJvbSAnLi9tb25pdG9yL01vbml0b3InXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IGZpbGVVcGxvYWQgZnJvbSAnZXhwcmVzcy1maWxldXBsb2FkJ1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgeyBMaXZlbmVzcyB9IGZyb20gJy4vcm91dGVzL0xpdmVuZXNzJ1xuaW1wb3J0IHsgUmVhZGluZXNzIH0gZnJvbSAnLi9yb3V0ZXMvUmVhZGluZXNzJ1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCB7IGlzTXlzcWxFcnJvciB9IGZyb20gJy4vTXlzcWxTZXJ2aWNlJ1xuaW1wb3J0IHsgTXlzcWxFcnJvciB9IGZyb20gJ215c3FsJ1xuaW1wb3J0IHsgU3RhdFNlcnZpY2UgfSBmcm9tICcuL1N0YXRTZXJ2aWNlJ1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuL2V4dGVybmFsL0V4dGVybmFsU2VydmljZUVuZHBvaW50J1xuXG5cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW17XHRcblx0aWQ6bnVtYmVyLFxuXHRjcmVhdGVkOm51bWJlcixcblx0dGltZTpudW1iZXIsXG5cdHJlZmVyZXI/OnN0cmluZyxcblx0cmVxdWVzdDp7W2tleTpzdHJpbmddOmFueX0sXG5cdHJlc3BvbnNlOntba2V5OnN0cmluZ106YW55fVxuXHRlcnJvcj86c3RyaW5nfG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlT3B0aW9uc3tcblx0cG9ydDpudW1iZXIsXG5cdGJhc2VFbmRQb2ludDpzdHJpbmcgLy8gXCIvYXBpL1wiXG5cdGNvcnNIb3N0V2hpdGVMaXN0OnN0cmluZ1tdLFxuXHRlbmRwb2ludHM6SUJhc2VFbmRwb2ludFtdLFxuXHRqc29uTGltaXQ6c3RyaW5nIC8vIFwiMTBtYlwiXG5cdG9uTmV0d29ya0xvZz86KChsb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtKT0+dm9pZCl8bnVsbFxuXHRvbkVycm9yPzooKC4uLnJlc3Q6YW55W10pPT52b2lkKXxudWxsXG5cdGlzUHJvZHVjdGlvbkVudmlyb25tZW50OmJvb2xlYW4sXG5cdGludGVyY2VwdG9yPzpJQmFzZUVuZHBvaW50LFxuXHRwb3N0cHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCxyZXM6UmVzcG9uc2UsZGF0YTpUcmFuc2ZlclBhY2tldFZPPGFueT4scmVxdWVzdFRpbWU6bnVtYmVyLGVuZHBvaW50PzpzdHJpbmcsbG9nPzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCk9PlByb21pc2U8VHJhbnNmZXJQYWNrZXRWTz5cblx0cHJlcHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCk9PmFueVxuXHRcblx0bW9uaXRvcj86e2xvZ2luOnN0cmluZyxwYXNzd29yZDpzdHJpbmd9W11cblx0Ly9kZXBsb3ltZW50Pzp7bG9naW46c3RyaW5nLHBhc3N3b3JkOnN0cmluZ31cblx0YXBwVmVyc2lvbj86c3RyaW5nXG5cblx0ZmlsZVRlbXBEaXI6c3RyaW5nO1xuXHRmaWxlTGltaXQ6bnVtYmVyIC8vIGJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCk6QVBJU2VydmljZU9wdGlvbnN7XG5cdHJldHVybiB7XG5cdFx0cG9ydDogODA5MSxcblx0XHRiYXNlRW5kUG9pbnQ6ICcvYXBpLycsXG5cdFx0Y29yc0hvc3RXaGl0ZUxpc3Q6IFtcblx0XHRcdCdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuXHRcdF0sXG5cdFx0ZW5kcG9pbnRzOiBbXSxcblx0XHRqc29uTGltaXQ6XCIxMG1iXCIsXG5cdFx0b25OZXR3b3JrTG9nOiBmdW5jdGlvbiAobG9nOiBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0pOiB2b2lkIHtcblx0XHRcdGxvZ0luZm8oXCIke0FQSVNlcnZpY2UuanN9XCIsbG9nKVxuXHRcdH0sXG5cdFx0b25FcnJvcjpmdW5jdGlvbihlcnI6YW55KXtcblx0XHRcdGxvZ0Vycm9yKFwiJHtBUElTZXJ2aWNlLmpzfVwiLGVycik7XG5cdFx0fSxcblx0XHRpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudDpmYWxzZSxcblx0XHRmaWxlTGltaXQ6NTAqMTAyNCoxMDI0LFxuXHRcdGZpbGVUZW1wRGlyOnBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSxcImZpbGVUZW1wRGlyXCIpXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFUV9DUkVBVEVfTkVUX0xPRzpSZXE8dm9pZCxBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0+ID0gbmV3IFJlcSh1bmRlZmluZWQsXCJSRVFfQ1JFQVRFX05FVF9MT0dcIik7XG5leHBvcnQgY29uc3QgUkVRX0hUVFBfTE9HOlJlcTx2b2lkLEFQSVNlcnZpY2VOZXR3b3JrTG9nSXRlbVtdPiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0hUVFBfTE9HXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UOlJlcTx2b2lkLG51bWJlcj4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1NFUlZFUjpSZXE8dm9pZCx7ZXhwcmVzczpBcHBsaWNhdGlvbixodHRwOmh0dHAuU2VydmVyfT4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1NFUlZFUlwiKTtcbmV4cG9ydCBjb25zdCBSRVFfSU5URVJOQUxfQ0FMTDpSZXE8SFRUUFJlcXVlc3RWTyxJRXJyb3J8YW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0lOVEVSTkFMX0NBTExcIik7XG5leHBvcnQgY29uc3QgUkVRX01PTklUT1JfVVNFUlM6UmVxPHthdXRob3JpemF0aW9uOnN0cmluZ30sYW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX01PTklUT1JfVVNFUlNcIik7XG5cbmNvbnN0IGFjdGl2ZVNlcnZpY2VzOlN0cmluZ1tdPVtdXG5jb25zdCBlbnRyeVBvaW50czpTdHJpbmdbXT1bXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdGlhbGl6ZXIoc2VydmljZXM6SUJhc2VTZXJ2aWNlW10pe1xuXHQvLyBhZGQgc3RhdCBzZXJ2aWNlXG5cdHNlcnZpY2VzLnB1c2gobmV3IFN0YXRTZXJ2aWNlKCkpO1xuXHRcbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGF3YWl0IGkuaW5pdCgpO2FjdGl2ZVNlcnZpY2VzLnB1c2goaS5nZXROYW1lKCkpIH1cbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGkuYXBwbGljYXRpb25SZWFkeSgpIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0Ly8gTkVUIExPR1xuXHRwcml2YXRlIHN0YXRpYyBuZXh0TG9nSUQ9MDtcblx0cHJpdmF0ZSB2ZXJzaW9uID0gXCIyLjcuM1wiXG5cdHByaXZhdGUgb3B0aW9uczpBUElTZXJ2aWNlT3B0aW9ucztcblx0cHJpdmF0ZSBtb25pdG9yPzpNb25pdG9yXG5cdHByaXZhdGUgbW9uaXRvckluZGV4RmlsZT86QnVmZmVyXG5cdHByaXZhdGUgc3RhcnRlZDpEYXRlID0gbmV3IERhdGUoKTtcblx0cHJpdmF0ZSByZXF1ZXN0c0NvdW50PTA7XG5cdHByaXZhdGUgc2VydmVyPWh0dHBcblxuXHRuZXRMb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtW109W107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86QVBJU2VydmljZU9wdGlvbnN8bnVsbCkge1xuXHRcdHN1cGVyKCdIVFRQIFNlcnZpY2UnKVxuXHRcdHRoaXMub3B0aW9ucz1vcHRpb25zID8/IGdldERlZmF1bHRPcHRpb25zKCk7XG5cdFx0aWYoIXRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdClcblx0XHRcdHRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdD1bXTtcblx0XHRjb25zdCBzZWxmID0gXCJodHRwOi8vbG9jYWxob3N0OlwiK3RoaXMub3B0aW9ucy5wb3J0O1xuXHRcdGlmKCF0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuZmluZCh2YWw9PnZhbD09PXNlbGYpKVxuXHRcdFx0dGhpcy5vcHRpb25zLmNvcnNIb3N0V2hpdGVMaXN0LnB1c2goKVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zLm1vbml0b3IubGVuZ3RoPjApe1xuXHRcdFx0dGhpcy5tb25pdG9yPW5ldyBNb25pdG9yKCk7XG5cdFx0XHR0aGlzLm9wdGlvbnMuZW5kcG9pbnRzLnB1c2godGhpcy5tb25pdG9yKVxuXHRcdFx0Y29uc29sZS53YXJuKFwiU2VydmljZSBNb25pdG9yIGluaXRpYWxpemVkXCIpXG5cdFx0XHRjb25zb2xlLndhcm4oXCJtb25pdG9yIGxpbmtzOlwiKVxuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdGNvbnNvbGUud2FybihcIk1vbml0b3IgbGluayBmb3I6IFwiK2kubG9naW4rXCIgLT4gL3NtLVwiK2hhc2gpXHRcdFx0XHRcdFx0XG5cdFx0XHR9XG5cblx0XHRcdFJFUV9NT05JVE9SX1VTRVJTLmxpc3RlbmVyID0gYXN5bmMgKHJlcSk9Pntcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gW11cblx0XHRcdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdGZvcihsZXQgaSBvZiB0aGlzLm9wdGlvbnMubW9uaXRvcil7XG5cdFx0XHRcdFx0XHRjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGkubG9naW4raS5wYXNzd29yZCkuZGlnZXN0KCkudG9TdHJpbmcoXCJoZXhcIik7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChoYXNoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhdHRhY2ggZW5kcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQoKSk7XG5cblx0XHQvLyBjcmVhdGUgbGl2ZW5lc3MsIHJlYWRpbmVzc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgTGl2ZW5lc3ModGhpcy5zdGFydGVkKSxuZXcgUmVhZGluZXNzKHRoaXMuc3RhcnRlZCkpXG5cdFx0UkVRX0hUVFBfUkVRVUVTVFNfQ09VTlQubGlzdGVuZXIgPSBhc3luYyAoKSA9PiB0aGlzLnJlcXVlc3RzQ291bnQ7XG5cdH1cblxuXG5cdG92ZXJyaWRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHRSRVFfSFRUUF9MT0cubGlzdGVuZXI9YXN5bmMgaWdub3JlPT50aGlzLm5ldExvZztcblx0XHRSRVFfQ1JFQVRFX05FVF9MT0cubGlzdGVuZXIgPSBhc3luYyBpZ25vcmU9Pntcblx0XHRcdGNvbnN0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0gPSB7XG5cdFx0XHRcdGNyZWF0ZWQ6ICtuZXcgRGF0ZSgpLFxuXHRcdFx0XHR0aW1lOiAwLFxuXHRcdFx0XHRyZXF1ZXN0OiB7fSxcblx0XHRcdFx0cmVzcG9uc2U6IHt9LFxuXHRcdFx0XHRlcnJvcjpudWxsLFxuXHRcdFx0XHRpZDogQVBJU2VydmljZS5uZXh0TG9nSUQrK1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5uZXRMb2cucHVzaChsb2cpXG5cdFx0XHRpZih0aGlzLm5ldExvZy5sZW5ndGg+MTAwMClcblx0XHRcdFx0dGhpcy5uZXRMb2cuc2hpZnQoKVxuXHRcdFx0cmV0dXJuIGxvZztcblx0XHR9XG5cblx0XHQvLyBpbnRlcm5hbCBjYWxsXG5cdFx0UkVRX0lOVEVSTkFMX0NBTEwubGlzdGVuZXIgPSBhc3luYyAocmVxKT0+e1xuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0XHRpZighaSB8fCAhaS5lbmRwb2ludHMpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdGZvcihsZXQgaiBvZiBpLmVuZHBvaW50cyl7XG5cdFx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRcdGVwID0gZXAucmVwbGFjZUFsbChcIi8vXCIsXCIvXCIpXG5cdFx0XHRcdFx0aWYoZXAgPT09IHJlcS5lbmRwb2ludCl7XG5cdFx0XHRcdFx0XHRyZXEuaW50ZXJuYWxDYWxsPXRydWU7XG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGkuZXhlY3V0ZShyZXEpXG5cdFx0XHRcdFx0XHRpZihyZXNwb25zZS5lcnJvcilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge2Vycm9yOkRlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNULGRhdGE6bnVsbCxodHRwU3RhdHVzOjQwNH1cblx0XHR9XG5cblx0XHQvLyBpbml0aWFsaXplIGV4cHJlc3Ncblx0XHRjb25zdCBhcHAgPSBleHByZXNzKClcblx0XHRjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuXG5cdFx0UkVRX0hUVFBfU0VSVkVSLmxpc3RlbmVyID0gYXN5bmMgaWdub3JlPT57cmV0dXJuIHtleHByZXNzOmFwcCxodHRwOnNlcnZlcn19O1xuXG5cdFx0aWYodGhpcy5vcHRpb25zLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KVxuXHRcdFx0YXBwLnNldChcImVudlwiLCdwcm9kdWN0aW9uJyk7XG5cblx0XHRhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiAnMTBtYicgfSkpIC8vIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cblx0XHRhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGxpbWl0OiAnMTBtYicsIGV4dGVuZGVkOiB0cnVlIH0pKSAvLyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblxuXHRcdGFwcC51c2UoZmlsZVVwbG9hZCh7XG5cdFx0XHRsaW1pdEhhbmRsZXI6IChyZXEsIHJlcywgbmV4dCk9Pntcblx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0XHRlcnJvcjpEZWZhdWx0RXJyb3JzLkZJTEVfVE9PX0xBUkdFLFxuXHRcdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0XHRodHRwU3RhdHVzOjQxMyxcblx0XHRcdFx0fSwrbmV3IERhdGUoKSxyZXEucGF0aCk7XG5cdFx0XHR9LFxuXHRcdFx0bGltaXRzOiB7IGZpbGVTaXplOiB0aGlzLm9wdGlvbnMuZmlsZUxpbWl0IH0sXG5cdFx0XHR1c2VUZW1wRmlsZXM6IHRydWUsXG5cdFx0XHR1cmlEZWNvZGVGaWxlTmFtZXM6IHRydWUsXG5cdFx0XHR0ZW1wRmlsZURpcjogdGhpcy5vcHRpb25zLmZpbGVUZW1wRGlyLFxuXHRcdFx0Ly9zYWZlRmlsZU5hbWVzOiB0cnVlLFxuXHRcdFx0YWJvcnRPbkxpbWl0OnRydWVcblx0XHR9KSlcblxuXHRcdGFwcC51c2UoYXN5bmMgKGVycjphbnkscmVxOmFueSxyZXNwOmFueSxuZXh0OmFueSk9Pntcblx0XHRcdFxuXHRcdFx0aWYoIWVycil7XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHRcdC8vcmVxdWVzdCBzdGFydCB0aW1lXG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGxvZyA9IGF3YWl0IFJFUV9DUkVBVEVfTkVUX0xPRy5yZXF1ZXN0KCk7XG5cdFx0XHRsb2cucmVxdWVzdD17XG5cdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRkYXRhOlwiXCIsXG5cdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zXG5cdFx0XHR9XG5cblx0XHRcdGxldCByZXNwb25zZUVycm9yPURlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNUO1xuXHRcdFx0aWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiYgZXJyLnN0YXR1cyA9PT0gNDAwICYmICdib2R5JyBpbiBlcnIgJiYgZXJyLnR5cGUgPT09ICdlbnRpdHkucGFyc2UuZmFpbGVkJykge1xuXHRcdFx0XHRyZXNwb25zZUVycm9yID0gRGVmYXVsdEVycm9ycy5KU09OX01BTEZPUk1FRFxuXHRcdFx0fVxuICAgICAgXG5cblx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlcS5nZXQoXCJSZWZlcmVyXCIpPz9cIlwiLHJlc3Ase1xuXHRcdFx0XHRlcnJvcjpyZXNwb25zZUVycm9yLFxuXHRcdFx0XHRkYXRhOm51bGwsXG5cdFx0XHRcdGh0dHBTdGF0dXM6NDAwXG5cdFx0XHR9LHRtZSxcIlwiLGxvZylcblxuXHRcdH0pXG5cblx0XHRjb25zdCBjb3JzT3B0aW9ucyA9IHtcblx0XHRcdG9yaWdpbjogKG9yaWdpbjogYW55LCBjYWxsYmFjazogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbklzV2hpdGVsaXN0ZWQgPSB0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuaW5jbHVkZXMob3JpZ2luKVxuXHRcdFx0XHRjYWxsYmFjayhudWxsLCBvcmlnaW5Jc1doaXRlbGlzdGVkKVxuXHRcdFx0fSxcblx0XHRcdGNyZWRlbnRpYWxzOiB0cnVlXG5cdFx0fVxuXHRcdGFwcC51c2UoY29ycyhjb3JzT3B0aW9ucykpXG5cblx0XHQvLyByZWdpc3RyYXRlIGVuZHBvaW50c1xuXHRcdEJhc2VFbmRwb2ludC5zZXRFbnRyeVBvaW50KHRoaXMub3B0aW9ucy5iYXNlRW5kUG9pbnQpXG5cdFx0XG5cdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0YXdhaXQgaS5pbml0KCk7XG5cdFx0XHRpZighaS5lbmRwb2ludHMpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Zm9yKGxldCBqIG9mIGkuZW5kcG9pbnRzKXtcblx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRlcCA9IGVwLnJlcGxhY2VBbGwoXCIvL1wiLFwiL1wiKVxuXHRcdFx0XHRcblxuXHRcdFx0XHQvLyBpbmNvbWluZyByZXF1ZXN0XG5cdFx0XHRcdGFwcC5hbGwoZXAsYXN5bmMgKHJlcSxyZXMpPT57XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0c0NvdW50Kys7XG5cdFx0XHRcdFx0Y29uc3QgdG1lID0gK25ldyBEYXRlKCk7XG5cdFx0XHRcdFx0bGV0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCA9IG51bGw7XG5cdFx0XHRcdFx0aWYoIWkuaWdub3JlSHR0cExvZ2dpbmcpe1xuXHRcdFx0XHRcdFx0bG9nID0gYXdhaXQgUkVRX0NSRUFURV9ORVRfTE9HLnJlcXVlc3QoKTtcblx0XHRcdFx0XHRcdGxvZy5yZXF1ZXN0PXtcblx0XHRcdFx0XHRcdFx0dXJsOnJlcS51cmwsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRkYXRhOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5ib2R5KSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5wYXJhbXMpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICgpPT57XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvZHkgPSByZXEuYm9keTtcblx0XHRcdFx0XHRcdGlmKHJlcS5xdWVyeSAmJiB0eXBlb2YgcmVxLnF1ZXJ5ID09PSBcIm9iamVjdFwiKXtcblx0XHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIHJlcS5xdWVyeSl7XG5cdFx0XHRcdFx0XHRcdFx0Ym9keVtpXT1yZXEucXVlcnlbaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgaHR0cFJlcXVlc3Q6SFRUUFJlcXVlc3RWTyA9IHtcblx0XHRcdFx0XHRcdFx0cmF3OnJlcSBhcyBJbmNvbWluZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlOnJlcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOnJlcS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGRhdGE6cmVxLmJvZHksXG5cdFx0XHRcdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOnJlcS5oZWFkZXJzIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0ZW5kcG9pbnQ6ZXAsXG5cdFx0XHRcdFx0XHRcdGZpbGVzOnJlcS5maWxlcyA/PyBudWxsLFxuXHRcdFx0XHRcdFx0XHRyZWZlcmVyOnJlcS5nZXQoXCJSZWZlcmVyXCIpLFxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZih0aGlzLm9wdGlvbnMucHJlcHJvZHVjZXIpe1xuXHRcdFx0XHRcdFx0XHR0cnl7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXByb2R1Y2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLnByZXByb2R1Y2VyKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0aWYocHJlcHJvZHVjZXJSZXN1bHQpXG5cdFx0XHRcdFx0XHRcdFx0aHR0cFJlcXVlc3QucHJlcHJvZHVjZXJSZXN1bHQgPSBwcmVwcm9kdWNlclJlc3VsdDtcblx0XHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHRcdGxldCBkZXRhaWxzPWAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdGxldCBzdGFjazpJRXJyb3JbXXx1bmRlZmluZWQ9dW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmKEVycm9yVXRpbHMuaXNFcnJvcihlKSl7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzPShlIGFzIGFueSkubWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhY2sgPSBbZSBhcyBhbnldO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmKGlzTXlzcWxFcnJvcihlKSlcblx0XHRcdFx0XHRcdFx0XHRcdGRldGFpbHMgPSAoZSBhcyBNeXNxbEVycm9yKS5tZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtlcnJvcjp7Y29kZToxMDAwMixtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsc3RhY2s6c3RhY2ssZGV0YWlsczpkZXRhaWxzfSxkYXRhOm51bGwsaHR0cFN0YXR1czo1MDB9LHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0XG5cdFx0XHRcdFx0XHR0cnl7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGlnbm9yZUludGVyY2VwdG9yID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGxldCBhbGxvd0ludGVyY2VwdG9yRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0aWYoai5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRpZ25vcmVJbnRlcmNlcHRvcj10cnVlO1xuXHRcdFx0XHRcdFx0XHRpZihqLmFsbG93SW50ZXJjZXB0b3JFcnJvcilcblx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZih0eXBlb2Ygai5oYW5kbGVyID09PSBcIm9iamVjdFwiICl7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdHJ5IHRvIGdldCBoYW5kbGVyIHJlbGF5aW5nIG9uIGh0dHAgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGouaGFuZGxlcltodHRwUmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKV07XG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZW9mIGhhbmRsZXIgPT09IFwib2JqZWN0XCIpe1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoaGFuZGxlci5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlSW50ZXJjZXB0b3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGhhbmRsZXIuYWxsb3dJbnRlcmNlcHRvckVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IFxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSBpbnRlcmNlcHRvciBpZiBleGlzdHNcblx0XHRcdFx0XHRcdFx0aWYoIWlnbm9yZUludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaW50ZXJjZXB0b3JSZXN1bHQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5vcHRpb25zLmludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRcdGludGVyY2VwdG9yUmVzdWx0PWF3YWl0IHRoaXMub3B0aW9ucy5pbnRlcmNlcHRvci5leGVjdXRlKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGludGVyY2VwdG9yUmVzdWx0LmVycm9yICYmICFhbGxvd0ludGVyY2VwdG9yRXJyb3Ipe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsaW50ZXJjZXB0b3JSZXN1bHQsdG1lLGVwLGxvZyxodHRwUmVxdWVzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LmludGVyY2VwdG9yUmVzdWx0ID0gaW50ZXJjZXB0b3JSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBQcmVjaGVjayBXSFk/XG5cdFx0XHRcdFx0XHRcdGlmKGkgPT09IHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHRodHRwUmVxdWVzdC5wcmVjaGVjaz17ZGF0YTp0aGlzLm9wdGlvbnMubW9uaXRvcn1cblxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmVjaGVjaz1hd2FpdCBpLnByZWNoZWNrKGh0dHBSZXF1ZXN0KVxuXHRcdFx0XHRcdFx0XHRpZihwcmVjaGVjayAmJiBwcmVjaGVjay5lcnJvcil7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHByZWNoZWNrLHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LnByZWNoZWNrPXByZWNoZWNrO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgaW50ZXJjZXB0b3IgaGFzIG5vIGVycm9ycywgZXhlY3V0ZSBtYWluIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgaS5leGVjdXRlKGh0dHBSZXF1ZXN0KVxuXG5cblx0XHRcdFx0XHRcdFx0IFxuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKGUpXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUZhdGFsRXJyb3IoZXApO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgZXJyb3IgaXMgSUVycm9yXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhOlRyYW5zZmVyUGFja2V0Vk8gPSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29kZToxMDAwMixcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6XCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGV0YWlsczpgJHtlfWBcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZihFcnJvclV0aWxzLmlzRXJyb3IoZSkpXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IHtlcnJvcjplIGFzIElFcnJvcn1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsZGF0YSx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHJlc3VsdCx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRleGVjdXRlKClcblx0XHRcdFx0fSk7Ly8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RcblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcblxuXHRcdC8vIGZpbmFsIGhhbmRsZXJcblx0XHRhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuXHRcdFx0XG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKVxuXG5cdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Ly9jaGVjayBpZiByZXF1ZXN0aW5nIG1vbml0b3Jcblx0XHRcdFx0aWYocmVxLm1ldGhvZD09PVwiR0VUXCIpe1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGxldCBtb25pdG9yUmVxdWVzdD1mYWxzZTtcblx0XHRcdFx0XHRmb3IobGV0IGkgb2YgdGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdFx0XHRpZihyZXEub3JpZ2luYWxVcmwuZW5kc1dpdGgoXCIvc20tXCIraGFzaCkpe1xuXHRcdFx0XHRcdFx0XHRtb25pdG9yUmVxdWVzdD10cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZihtb25pdG9yUmVxdWVzdCl7XG5cdFx0XHRcdFx0XHQvLyBzZW5kIGluZGV4IFRodSwgMTYgTm92IDIwMjMgMjM6MzM6MzUgR01UXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMubW9uaXRvckluZGV4RmlsZSlcblx0XHRcdFx0XHRcdFx0dGhpcy5tb25pdG9ySW5kZXhGaWxlID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsXCJtb25pdG9yXCIsXCJpbmRleC5odG1sXCIpKTtcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLFwidGV4dC9odG1sXCIpXG5cdFx0XHRcdFx0XHRcdHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiLHRoaXMubW9uaXRvckluZGV4RmlsZS5ieXRlTGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRyZXMuc3RhdHVzKDIwMCkuc2VuZCh0aGlzLm1vbml0b3JJbmRleEZpbGUpO1xuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOntcblx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6MTAwMDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzOmAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcdFx0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdFxuXHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0ZXJyb3I6RGVmYXVsdEVycm9ycy5VTktOT1dOX1JFUVVFU1QsXG5cdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0aHR0cFN0YXR1czo0MDRcblx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcblx0XHR9KVxuXG5cdFx0c2VydmVyLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSlcblxuXHRcdC8qYXBwLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSkqL1xuXHR9XG5cblx0YXN5bmMgc2VuZFJlc3BvbnNlKHJlZjpzdHJpbmcscmVzOlJlc3BvbnNlLGRhdGE6VHJhbnNmZXJQYWNrZXRWTzxhbnk+LHJlcXVlc3RUaW1lOm51bWJlcixlbmRwb2ludD86c3RyaW5nLGxvZz86QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtfG51bGwscmVxPzpIVFRQUmVxdWVzdFZPKXtcblxuXHRcdGlmKGRhdGEuYmxvY2tSZXNwb25zZSl7XG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiUmVzcG9uc2UgYmxvY2tlZFwiXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYocmVxICYmIHJlcS5zdHJlYW0pe1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLnBvc3Rwcm9kdWNlcil7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGRhdGEgPSBhd2FpdCB0aGlzLm9wdGlvbnMucG9zdHByb2R1Y2VyKHJlcSxyZXMsZGF0YSxyZXF1ZXN0VGltZSxlbmRwb2ludCxsb2cpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRsb2dFcnJvcihcIlBvc3Rwcm9kdWNlciBlcnJvclwiLGUpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYoRXJyb3JVdGlscy5pc0Vycm9yKGRhdGEpKVxuXHRcdFx0ZGF0YSA9IHtlcnJvcjpkYXRhIGFzIElFcnJvcixkYXRhOm51bGx9XG5cdFx0XG4gICAgICAgIGRhdGEucmVzcG9uc2VUaW1lID0gKCtuZXcgRGF0ZSgpKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICBkYXRhLmNvcmUgPSB0aGlzLnZlcnNpb25cbiAgICAgICAgZGF0YS5lbmRwb2ludCA9IGVuZHBvaW50ID8/IFwibm9fZW5kcG9pbnRcIlxuXHRcdFxuXHRcdGlmKHRoaXMub3B0aW9ucy5hcHBWZXJzaW9uKVxuXHRcdFx0ZGF0YS52ZXJzaW9uPXRoaXMub3B0aW9ucy5hcHBWZXJzaW9uXG5cblx0XHRcblx0XHRpZihsb2cpe1xuXHRcdFx0bG9nLnRpbWUgPSBkYXRhLnJlc3BvbnNlVGltZVxuXHRcdFx0bG9nLnJlZmVyZXI9cmVmO1xuXHRcdH1cblxuXHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdHRoaXMubW9uaXRvci5yZWdpc3RyYXRlUmVzcG9uc2UoZGF0YS5lbmRwb2ludCxkYXRhLnJlc3BvbnNlVGltZSlcblxuICAgICAgICBpZihyZXMuZGVzdHJveWVkIHx8IHJlcy5jbG9zZWQpe1xuXG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCwgY2FuJ3Qgc2VuZCByZXNwb25zZSBmb3I6IFwiK2RhdGEuZW5kcG9pbnRcblx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuICAgICAgICAgICAgXHR0aGlzLm9wdGlvbnMub25FcnJvcihcIkNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQsIGNhbid0IHNlbmQgcmVzcG9uc2U6IFwiK2RhdGEuZW5kcG9pbnQsZGF0YSlcbiAgICAgICAgICAgIFxuXHRcdFx0aWYodGhpcy5tb25pdG9yKVxuXHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG4gICAgICAgIH1lbHNle1xuXHRcdFx0dHJ5e1xuXG5cdFx0XHRcdGlmKGRhdGEuZmlsZSl7XG5cblx0XHRcdFx0XHRyZXMuc2VuZEZpbGUoZGF0YS5maWxlLGVycj0+e1xuXHRcdFx0XHRcdFx0aWYoZXJyKXtcblx0XHRcdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0XHRcdGxvZy5lcnJvciA9IFwiQ2FuJ3Qgc2VuZCBmaWxlOiBcIitkYXRhLmZpbGVcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgZGF0YS5lbmRwb2ludClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlZixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOkRlZmF1bHRFcnJvcnMuQ0FOVF9TRU5EX0ZJTEUsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0scmVxdWVzdFRpbWUsZGF0YS5lbmRwb2ludCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9KVxuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZihkYXRhLnJlZGlyZWN0KXtcblx0XHRcdFx0XHRyZXMucmVkaXJlY3QoZGF0YS5yZWRpcmVjdCk7XG5cdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0ge3JlZGlyZWN0OmRhdGEucmVkaXJlY3R9XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vIHNldHVwIGhlYWRlcnNcblx0XHRcdFx0XHRpZihkYXRhLmhlYWRlcnMpe1xuXHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIGRhdGEuaGVhZGVycylcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihpLGRhdGEuaGVhZGVyc1tpXSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLmh0dHBTdGF0dXMgJiYgZGF0YS5lcnJvci5odHRwU3RhdHVzPjk5KVxuXHRcdFx0XHRcdFx0cmVzLnN0YXR1c0NvZGUgPSBkYXRhLmVycm9yLmh0dHBTdGF0dXNcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXMuc3RhdHVzQ29kZT1kYXRhLmh0dHBTdGF0dXMgPz8gMjAwXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYoZGF0YS5yYXdSZXNwb25zZSl7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhLmRhdGEpXG5cdFx0XHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0XHRcdGxvZy5yZXNwb25zZSA9IHRoaXMuY2hlY2tEYXRhTGVuZ3RoKGRhdGEpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhKTtcblx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0gdGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YSlcblxuXHRcdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiB0aGlzLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpXG5cdFx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0XHRsb2cuZXJyb3IgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9Y2F0Y2goZSl7XG5cdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKFwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiLGUpO1xuXHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0bG9nLmVycm9yPVwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiXG5cdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHNob3cgbG9nXG5cdFx0aWYobG9nICYmIGxvZy5lcnJvciAmJiB0aGlzLm9wdGlvbnMub25FcnJvcil7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25FcnJvcihsb2cuZXJyb3IpXG5cdFx0fWVsc2V7XG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0fVxuICAgIH1cblxuXG5cdGNoZWNrRGF0YUxlbmd0aChkYXRhOmFueSxyZXN1bHQ/OmFueSxsdmw/Om51bWJlcik6YW55e1xuXHRcdFxuXHRcdGlmKCFsdmwpXG5cdFx0XHRsdmw9MDtcblxuXHRcdGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKXtcblx0XHRcdGlmKHR5cGVvZiBkYXRhPT09XCJzdHJpbmdcIiAmJiBkYXRhLmxlbmd0aD4xMDI0KVxuXHRcdFx0XHRyZXR1cm4gZGF0YS5zdWJzdHJpbmcoMCwxMDAwKStcIi4uLiAodG90YWw6XCIgKyBkYXRhLmxlbmd0aCArIFwiKVwiXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIil7XG5cdFx0XHRpZighcmVzdWx0KVxuXHRcdFx0XHRyZXN1bHQ9e307XG5cdFx0XHRsZXQgYXJyY250ID0gMTAwO1xuXHRcdFx0Zm9yKGxldCBpIGluIGRhdGEpe1xuXHRcdFx0XHRyZXN1bHRbaV09dGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YVtpXSxyZXN1bHRbaV0sbHZsKzEpO1xuXHRcdFx0XHRhcnJjbnQtLTtcblx0XHRcdFx0aWYoYXJyY250PD0wKXtcblx0XHRcdFx0XHRyZXN1bHRbXCIuLi5cIl09XCIuLi4gdG90YWw6IFwiK0FycmF5LmlzQXJyYXkoZGF0YSk/ZGF0YS5sZW5ndGg6T2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQgPz8gbnVsbDtcblx0fVxuXG59XG4iXX0=
513
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVBJU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvQVBJU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsZ0RBQXVCO0FBRXZCLGlEQUE0RDtBQUM1RCw0RUFBc0U7QUFFdEUsbURBQWtDO0FBQ2xDLDZDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsZ0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1Qiw0Q0FBbUI7QUFDbkIsNEVBQTJDO0FBQzNDLDRDQUFtQjtBQUNuQixnREFBNEM7QUFDNUMsa0RBQThDO0FBQzlDLGdEQUF1QjtBQUN2QixpREFBNkM7QUFFN0MsK0NBQTJDO0FBQzNDLGdGQUE0RTtBQW1DNUUsU0FBZ0IsaUJBQWlCO0lBQ2hDLE9BQU87UUFDTixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxPQUFPO1FBQ3JCLGlCQUFpQixFQUFFO1lBQ2xCLHVCQUF1QjtTQUN2QjtRQUNELFNBQVMsRUFBRSxFQUFFO1FBQ2IsU0FBUyxFQUFDLE1BQU07UUFDaEIsWUFBWSxFQUFFLFVBQVUsR0FBNkI7WUFDcEQsSUFBQSxvQkFBTyxFQUFDLGtCQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLENBQUM7UUFDRCxPQUFPLEVBQUMsVUFBUyxHQUFPO1lBQ3ZCLElBQUEscUJBQVEsRUFBQyxrQkFBa0IsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsdUJBQXVCLEVBQUMsS0FBSztRQUM3QixTQUFTLEVBQUMsRUFBRSxHQUFDLElBQUksR0FBQyxJQUFJO1FBQ3RCLFdBQVcsRUFBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxhQUFhLENBQUM7S0FDbkQsQ0FBQTtBQUNGLENBQUM7QUFuQkQsOENBbUJDO0FBRVksUUFBQSxrQkFB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QWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUM7WUFDM0IsSUFBRyxDQUFDLE1BQU07Z0JBQ1QsTUFBTSxHQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqQixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBQztnQkFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUcsTUFBTSxJQUFFLENBQUMsRUFBQztvQkFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUMsYUFBYSxHQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNyRixNQUFNO2lCQUNOO2FBQ0Q7U0FDRDtRQUNELE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQztJQUN2QixDQUFDOztBQWhoQkYsZ0NBa2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzLCB7IEFwcGxpY2F0aW9uLCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9CYXNlU2VydmljZSdcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgQmFzZUVuZHBvaW50LCBJQmFzZUVuZHBvaW50IH0gZnJvbSAnLi9CYXNlRW5kcG9pbnQnXG5pbXBvcnQgRGVmYXVsdEVycm9ycywgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnMnXG5pbXBvcnQgeyBIVFRQUmVxdWVzdFZPLCBJRXJyb3IsIFRyYW5zZmVyUGFja2V0Vk8gfSBmcm9tICcuL3N0cnVjdHVyZXMvSW50ZXJmYWNlcydcbmltcG9ydCB7UmVxfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIlxuaW1wb3J0IHsgbG9nQ3JpdCwgbG9nRXJyb3IsIGxvZ0luZm8gfSBmcm9tICcuL0xvZ1NlcnZpY2UnXG5pbXBvcnQgeyBNb25pdG9yIH0gZnJvbSAnLi9tb25pdG9yL01vbml0b3InXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IGZpbGVVcGxvYWQgZnJvbSAnZXhwcmVzcy1maWxldXBsb2FkJ1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgeyBMaXZlbmVzcyB9IGZyb20gJy4vcm91dGVzL0xpdmVuZXNzJ1xuaW1wb3J0IHsgUmVhZGluZXNzIH0gZnJvbSAnLi9yb3V0ZXMvUmVhZGluZXNzJ1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCB7IGlzTXlzcWxFcnJvciB9IGZyb20gJy4vTXlzcWxTZXJ2aWNlJ1xuaW1wb3J0IHsgTXlzcWxFcnJvciB9IGZyb20gJ215c3FsJ1xuaW1wb3J0IHsgU3RhdFNlcnZpY2UgfSBmcm9tICcuL1N0YXRTZXJ2aWNlJ1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuL2V4dGVybmFsL0V4dGVybmFsU2VydmljZUVuZHBvaW50J1xuXG5cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW17XHRcblx0aWQ6bnVtYmVyLFxuXHRjcmVhdGVkOm51bWJlcixcblx0dGltZTpudW1iZXIsXG5cdHJlZmVyZXI/OnN0cmluZyxcblx0cmVxdWVzdDp7W2tleTpzdHJpbmddOmFueX0sXG5cdHJlc3BvbnNlOntba2V5OnN0cmluZ106YW55fVxuXHRlcnJvcj86c3RyaW5nfG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlT3B0aW9uc3tcblx0cG9ydDpudW1iZXIsXG5cdGJhc2VFbmRQb2ludDpzdHJpbmcgLy8gXCIvYXBpL1wiXG5cdGNvcnNIb3N0V2hpdGVMaXN0OnN0cmluZ1tdLFxuXHRlbmRwb2ludHM6SUJhc2VFbmRwb2ludFtdLFxuXHRqc29uTGltaXQ6c3RyaW5nIC8vIFwiMTBtYlwiXG5cdG9uTmV0d29ya0xvZz86KChsb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtKT0+dm9pZCl8bnVsbFxuXHRvbkVycm9yPzooKC4uLnJlc3Q6YW55W10pPT52b2lkKXxudWxsXG5cdGlzUHJvZHVjdGlvbkVudmlyb25tZW50OmJvb2xlYW4sXG5cdGludGVyY2VwdG9yPzpJQmFzZUVuZHBvaW50LFxuXHRwb3N0cHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCxyZXM6UmVzcG9uc2UsZGF0YTpUcmFuc2ZlclBhY2tldFZPPGFueT4scmVxdWVzdFRpbWU6bnVtYmVyLGVuZHBvaW50PzpzdHJpbmcsbG9nPzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCk9PlByb21pc2U8VHJhbnNmZXJQYWNrZXRWTz5cblx0cHJlcHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCk9PmFueVxuXHRcblx0bW9uaXRvcj86e2xvZ2luOnN0cmluZyxwYXNzd29yZDpzdHJpbmd9W11cblx0Ly9kZXBsb3ltZW50Pzp7bG9naW46c3RyaW5nLHBhc3N3b3JkOnN0cmluZ31cblx0YXBwVmVyc2lvbj86c3RyaW5nXG5cblx0ZmlsZVRlbXBEaXI6c3RyaW5nO1xuXHRmaWxlTGltaXQ6bnVtYmVyIC8vIGJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCk6QVBJU2VydmljZU9wdGlvbnN7XG5cdHJldHVybiB7XG5cdFx0cG9ydDogODA5MSxcblx0XHRiYXNlRW5kUG9pbnQ6ICcvYXBpLycsXG5cdFx0Y29yc0hvc3RXaGl0ZUxpc3Q6IFtcblx0XHRcdCdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuXHRcdF0sXG5cdFx0ZW5kcG9pbnRzOiBbXSxcblx0XHRqc29uTGltaXQ6XCIxMG1iXCIsXG5cdFx0b25OZXR3b3JrTG9nOiBmdW5jdGlvbiAobG9nOiBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0pOiB2b2lkIHtcblx0XHRcdGxvZ0luZm8oXCIke0FQSVNlcnZpY2UuanN9XCIsbG9nKVxuXHRcdH0sXG5cdFx0b25FcnJvcjpmdW5jdGlvbihlcnI6YW55KXtcblx0XHRcdGxvZ0Vycm9yKFwiJHtBUElTZXJ2aWNlLmpzfVwiLGVycik7XG5cdFx0fSxcblx0XHRpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudDpmYWxzZSxcblx0XHRmaWxlTGltaXQ6NTAqMTAyNCoxMDI0LFxuXHRcdGZpbGVUZW1wRGlyOnBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSxcImZpbGVUZW1wRGlyXCIpXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFUV9DUkVBVEVfTkVUX0xPRzpSZXE8dm9pZCxBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0+ID0gbmV3IFJlcSh1bmRlZmluZWQsXCJSRVFfQ1JFQVRFX05FVF9MT0dcIik7XG5leHBvcnQgY29uc3QgUkVRX0hUVFBfTE9HOlJlcTx2b2lkLEFQSVNlcnZpY2VOZXR3b3JrTG9nSXRlbVtdPiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0hUVFBfTE9HXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UOlJlcTx2b2lkLG51bWJlcj4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1NFUlZFUjpSZXE8dm9pZCx7ZXhwcmVzczpBcHBsaWNhdGlvbixodHRwOmh0dHAuU2VydmVyfT4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1NFUlZFUlwiKTtcbmV4cG9ydCBjb25zdCBSRVFfSU5URVJOQUxfQ0FMTDpSZXE8SFRUUFJlcXVlc3RWTyxJRXJyb3J8YW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0lOVEVSTkFMX0NBTExcIik7XG5leHBvcnQgY29uc3QgUkVRX01PTklUT1JfVVNFUlM6UmVxPHthdXRob3JpemF0aW9uOnN0cmluZ30sYW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX01PTklUT1JfVVNFUlNcIik7XG5cbmNvbnN0IGFjdGl2ZVNlcnZpY2VzOlN0cmluZ1tdPVtdXG5jb25zdCBlbnRyeVBvaW50czpTdHJpbmdbXT1bXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdGlhbGl6ZXIoc2VydmljZXM6SUJhc2VTZXJ2aWNlW10pe1xuXHQvLyBhZGQgc3RhdCBzZXJ2aWNlXG5cdHNlcnZpY2VzLnB1c2gobmV3IFN0YXRTZXJ2aWNlKCkpO1xuXHRcbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGF3YWl0IGkuaW5pdCgpO2FjdGl2ZVNlcnZpY2VzLnB1c2goaS5nZXROYW1lKCkpIH1cbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGkuYXBwbGljYXRpb25SZWFkeSgpIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0Ly8gTkVUIExPR1xuXHRwcml2YXRlIHN0YXRpYyBuZXh0TG9nSUQ9MDtcblx0cHJpdmF0ZSB2ZXJzaW9uID0gXCIyLjcuNVwiXG5cdHByaXZhdGUgb3B0aW9uczpBUElTZXJ2aWNlT3B0aW9ucztcblx0cHJpdmF0ZSBtb25pdG9yPzpNb25pdG9yXG5cdHByaXZhdGUgbW9uaXRvckluZGV4RmlsZT86QnVmZmVyXG5cdHByaXZhdGUgc3RhcnRlZDpEYXRlID0gbmV3IERhdGUoKTtcblx0cHJpdmF0ZSByZXF1ZXN0c0NvdW50PTA7XG5cdHByaXZhdGUgc2VydmVyPWh0dHBcblxuXHRuZXRMb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtW109W107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86QVBJU2VydmljZU9wdGlvbnN8bnVsbCkge1xuXHRcdHN1cGVyKCdIVFRQIFNlcnZpY2UnKVxuXHRcdHRoaXMub3B0aW9ucz1vcHRpb25zID8/IGdldERlZmF1bHRPcHRpb25zKCk7XG5cdFx0aWYoIXRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdClcblx0XHRcdHRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdD1bXTtcblx0XHRjb25zdCBzZWxmID0gXCJodHRwOi8vbG9jYWxob3N0OlwiK3RoaXMub3B0aW9ucy5wb3J0O1xuXHRcdGlmKCF0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuZmluZCh2YWw9PnZhbD09PXNlbGYpKVxuXHRcdFx0dGhpcy5vcHRpb25zLmNvcnNIb3N0V2hpdGVMaXN0LnB1c2goKVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zLm1vbml0b3IubGVuZ3RoPjApe1xuXHRcdFx0dGhpcy5tb25pdG9yPW5ldyBNb25pdG9yKCk7XG5cdFx0XHR0aGlzLm9wdGlvbnMuZW5kcG9pbnRzLnB1c2godGhpcy5tb25pdG9yKVxuXHRcdFx0Y29uc29sZS53YXJuKFwiU2VydmljZSBNb25pdG9yIGluaXRpYWxpemVkXCIpXG5cdFx0XHRjb25zb2xlLndhcm4oXCJtb25pdG9yIGxpbmtzOlwiKVxuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdGNvbnNvbGUud2FybihcIk1vbml0b3IgbGluayBmb3I6IFwiK2kubG9naW4rXCIgLT4gL3NtLVwiK2hhc2gpXHRcdFx0XHRcdFx0XG5cdFx0XHR9XG5cblx0XHRcdFJFUV9NT05JVE9SX1VTRVJTLmxpc3RlbmVyID0gYXN5bmMgKHJlcSk9Pntcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gW11cblx0XHRcdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdGZvcihsZXQgaSBvZiB0aGlzLm9wdGlvbnMubW9uaXRvcil7XG5cdFx0XHRcdFx0XHRjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGkubG9naW4raS5wYXNzd29yZCkuZGlnZXN0KCkudG9TdHJpbmcoXCJoZXhcIik7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChoYXNoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhdHRhY2ggZW5kcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQoKSk7XG5cblx0XHQvLyBjcmVhdGUgbGl2ZW5lc3MsIHJlYWRpbmVzc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgTGl2ZW5lc3ModGhpcy5zdGFydGVkKSxuZXcgUmVhZGluZXNzKHRoaXMuc3RhcnRlZCkpXG5cdFx0UkVRX0hUVFBfUkVRVUVTVFNfQ09VTlQubGlzdGVuZXIgPSBhc3luYyAoKSA9PiB0aGlzLnJlcXVlc3RzQ291bnQ7XG5cdH1cblxuXG5cdG92ZXJyaWRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHRSRVFfSFRUUF9MT0cubGlzdGVuZXI9YXN5bmMgaWdub3JlPT50aGlzLm5ldExvZztcblx0XHRSRVFfQ1JFQVRFX05FVF9MT0cubGlzdGVuZXIgPSBhc3luYyBpZ25vcmU9Pntcblx0XHRcdGNvbnN0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0gPSB7XG5cdFx0XHRcdGNyZWF0ZWQ6ICtuZXcgRGF0ZSgpLFxuXHRcdFx0XHR0aW1lOiAwLFxuXHRcdFx0XHRyZXF1ZXN0OiB7fSxcblx0XHRcdFx0cmVzcG9uc2U6IHt9LFxuXHRcdFx0XHRlcnJvcjpudWxsLFxuXHRcdFx0XHRpZDogQVBJU2VydmljZS5uZXh0TG9nSUQrK1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5uZXRMb2cucHVzaChsb2cpXG5cdFx0XHRpZih0aGlzLm5ldExvZy5sZW5ndGg+MTAwMClcblx0XHRcdFx0dGhpcy5uZXRMb2cuc2hpZnQoKVxuXHRcdFx0cmV0dXJuIGxvZztcblx0XHR9XG5cblx0XHQvLyBpbnRlcm5hbCBjYWxsXG5cdFx0UkVRX0lOVEVSTkFMX0NBTEwubGlzdGVuZXIgPSBhc3luYyAocmVxKT0+e1xuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0XHRpZighaSB8fCAhaS5lbmRwb2ludHMpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdGZvcihsZXQgaiBvZiBpLmVuZHBvaW50cyl7XG5cdFx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRcdGVwID0gZXAucmVwbGFjZUFsbChcIi8vXCIsXCIvXCIpXG5cdFx0XHRcdFx0aWYoZXAgPT09IHJlcS5lbmRwb2ludCl7XG5cdFx0XHRcdFx0XHRyZXEuaW50ZXJuYWxDYWxsPXRydWU7XG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGkuZXhlY3V0ZShyZXEpXG5cdFx0XHRcdFx0XHRpZihyZXNwb25zZS5lcnJvcilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge2Vycm9yOkRlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNULGRhdGE6bnVsbCxodHRwU3RhdHVzOjQwNH1cblx0XHR9XG5cblx0XHQvLyBpbml0aWFsaXplIGV4cHJlc3Ncblx0XHRjb25zdCBhcHAgPSBleHByZXNzKClcblx0XHRjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuXG5cdFx0UkVRX0hUVFBfU0VSVkVSLmxpc3RlbmVyID0gYXN5bmMgaWdub3JlPT57cmV0dXJuIHtleHByZXNzOmFwcCxodHRwOnNlcnZlcn19O1xuXG5cdFx0aWYodGhpcy5vcHRpb25zLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KVxuXHRcdFx0YXBwLnNldChcImVudlwiLCdwcm9kdWN0aW9uJyk7XG5cblx0XHRhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiAnMTBtYicgfSkpIC8vIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cblx0XHRhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGxpbWl0OiAnMTBtYicsIGV4dGVuZGVkOiB0cnVlIH0pKSAvLyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblxuXHRcdGFwcC51c2UoZmlsZVVwbG9hZCh7XG5cdFx0XHRsaW1pdEhhbmRsZXI6IChyZXEsIHJlcywgbmV4dCk9Pntcblx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0XHRlcnJvcjpEZWZhdWx0RXJyb3JzLkZJTEVfVE9PX0xBUkdFLFxuXHRcdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0XHRodHRwU3RhdHVzOjQxMyxcblx0XHRcdFx0fSwrbmV3IERhdGUoKSxyZXEucGF0aCk7XG5cdFx0XHR9LFxuXHRcdFx0bGltaXRzOiB7IGZpbGVTaXplOiB0aGlzLm9wdGlvbnMuZmlsZUxpbWl0IH0sXG5cdFx0XHR1c2VUZW1wRmlsZXM6IHRydWUsXG5cdFx0XHR1cmlEZWNvZGVGaWxlTmFtZXM6IHRydWUsXG5cdFx0XHR0ZW1wRmlsZURpcjogdGhpcy5vcHRpb25zLmZpbGVUZW1wRGlyLFxuXHRcdFx0Ly9zYWZlRmlsZU5hbWVzOiB0cnVlLFxuXHRcdFx0YWJvcnRPbkxpbWl0OnRydWVcblx0XHR9KSlcblxuXHRcdGFwcC51c2UoYXN5bmMgKGVycjphbnkscmVxOmFueSxyZXNwOmFueSxuZXh0OmFueSk9Pntcblx0XHRcdFxuXHRcdFx0aWYoIWVycil7XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHRcdC8vcmVxdWVzdCBzdGFydCB0aW1lXG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGxvZyA9IGF3YWl0IFJFUV9DUkVBVEVfTkVUX0xPRy5yZXF1ZXN0KCk7XG5cdFx0XHRsb2cucmVxdWVzdD17XG5cdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRkYXRhOlwiXCIsXG5cdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zXG5cdFx0XHR9XG5cblx0XHRcdGxldCByZXNwb25zZUVycm9yPURlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNUO1xuXHRcdFx0aWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiYgZXJyLnN0YXR1cyA9PT0gNDAwICYmICdib2R5JyBpbiBlcnIgJiYgZXJyLnR5cGUgPT09ICdlbnRpdHkucGFyc2UuZmFpbGVkJykge1xuXHRcdFx0XHRyZXNwb25zZUVycm9yID0gRGVmYXVsdEVycm9ycy5KU09OX01BTEZPUk1FRFxuXHRcdFx0fVxuICAgICAgXG5cblx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlcS5nZXQoXCJSZWZlcmVyXCIpPz9cIlwiLHJlc3Ase1xuXHRcdFx0XHRlcnJvcjpyZXNwb25zZUVycm9yLFxuXHRcdFx0XHRkYXRhOm51bGwsXG5cdFx0XHRcdGh0dHBTdGF0dXM6NDAwXG5cdFx0XHR9LHRtZSxcIlwiLGxvZylcblxuXHRcdH0pXG5cblx0XHRjb25zdCBjb3JzT3B0aW9ucyA9IHtcblx0XHRcdG9yaWdpbjogKG9yaWdpbjogYW55LCBjYWxsYmFjazogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbklzV2hpdGVsaXN0ZWQgPSB0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuaW5jbHVkZXMob3JpZ2luKVxuXHRcdFx0XHRjYWxsYmFjayhudWxsLCBvcmlnaW5Jc1doaXRlbGlzdGVkKVxuXHRcdFx0fSxcblx0XHRcdGNyZWRlbnRpYWxzOiB0cnVlXG5cdFx0fVxuXHRcdGFwcC51c2UoY29ycyhjb3JzT3B0aW9ucykpXG5cblx0XHQvLyByZWdpc3RyYXRlIGVuZHBvaW50c1xuXHRcdEJhc2VFbmRwb2ludC5zZXRFbnRyeVBvaW50KHRoaXMub3B0aW9ucy5iYXNlRW5kUG9pbnQpXG5cdFx0XG5cdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0YXdhaXQgaS5pbml0KCk7XG5cdFx0XHRpZighaS5lbmRwb2ludHMpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Zm9yKGxldCBqIG9mIGkuZW5kcG9pbnRzKXtcblx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRlcCA9IGVwLnJlcGxhY2VBbGwoXCIvL1wiLFwiL1wiKVxuXHRcdFx0XHRcblxuXHRcdFx0XHQvLyBpbmNvbWluZyByZXF1ZXN0XG5cdFx0XHRcdGFwcC5hbGwoZXAsYXN5bmMgKHJlcSxyZXMpPT57XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0c0NvdW50Kys7XG5cdFx0XHRcdFx0Y29uc3QgdG1lID0gK25ldyBEYXRlKCk7XG5cdFx0XHRcdFx0bGV0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCA9IG51bGw7XG5cdFx0XHRcdFx0aWYoIWkuaWdub3JlSHR0cExvZ2dpbmcpe1xuXHRcdFx0XHRcdFx0bG9nID0gYXdhaXQgUkVRX0NSRUFURV9ORVRfTE9HLnJlcXVlc3QoKTtcblx0XHRcdFx0XHRcdGxvZy5yZXF1ZXN0PXtcblx0XHRcdFx0XHRcdFx0dXJsOnJlcS51cmwsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRkYXRhOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5ib2R5KSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5wYXJhbXMpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICgpPT57XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvZHkgPSByZXEuYm9keTtcblx0XHRcdFx0XHRcdGlmKHJlcS5xdWVyeSAmJiB0eXBlb2YgcmVxLnF1ZXJ5ID09PSBcIm9iamVjdFwiKXtcblx0XHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIHJlcS5xdWVyeSl7XG5cdFx0XHRcdFx0XHRcdFx0Ym9keVtpXT1yZXEucXVlcnlbaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgaHR0cFJlcXVlc3Q6SFRUUFJlcXVlc3RWTyA9IHtcblx0XHRcdFx0XHRcdFx0cmF3OnJlcSBhcyBJbmNvbWluZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlOnJlcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOnJlcS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGRhdGE6cmVxLmJvZHksXG5cdFx0XHRcdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOnJlcS5oZWFkZXJzIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0ZW5kcG9pbnQ6ZXAsXG5cdFx0XHRcdFx0XHRcdGZpbGVzOnJlcS5maWxlcyA/PyBudWxsLFxuXHRcdFx0XHRcdFx0XHRyZWZlcmVyOnJlcS5nZXQoXCJSZWZlcmVyXCIpLFxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZih0aGlzLm9wdGlvbnMucHJlcHJvZHVjZXIpe1xuXHRcdFx0XHRcdFx0XHR0cnl7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXByb2R1Y2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLnByZXByb2R1Y2VyKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0aWYocHJlcHJvZHVjZXJSZXN1bHQpXG5cdFx0XHRcdFx0XHRcdFx0aHR0cFJlcXVlc3QucHJlcHJvZHVjZXJSZXN1bHQgPSBwcmVwcm9kdWNlclJlc3VsdDtcblx0XHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHRcdGxldCBkZXRhaWxzPWAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdGxldCBzdGFjazpJRXJyb3JbXXx1bmRlZmluZWQ9dW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmKEVycm9yVXRpbHMuaXNFcnJvcihlKSl7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzPShlIGFzIGFueSkubWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhY2sgPSBbZSBhcyBhbnldO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmKGlzTXlzcWxFcnJvcihlKSlcblx0XHRcdFx0XHRcdFx0XHRcdGRldGFpbHMgPSAoZSBhcyBNeXNxbEVycm9yKS5tZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtlcnJvcjp7Y29kZToxMDAwMixtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsc3RhY2s6c3RhY2ssZGV0YWlsczpkZXRhaWxzfSxkYXRhOm51bGwsaHR0cFN0YXR1czo1MDB9LHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0XG5cdFx0XHRcdFx0XHR0cnl7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGlnbm9yZUludGVyY2VwdG9yID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGxldCBhbGxvd0ludGVyY2VwdG9yRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0aWYoai5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRpZ25vcmVJbnRlcmNlcHRvcj10cnVlO1xuXHRcdFx0XHRcdFx0XHRpZihqLmFsbG93SW50ZXJjZXB0b3JFcnJvcilcblx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZih0eXBlb2Ygai5oYW5kbGVyID09PSBcIm9iamVjdFwiICl7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdHJ5IHRvIGdldCBoYW5kbGVyIHJlbGF5aW5nIG9uIGh0dHAgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGouaGFuZGxlcltodHRwUmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKV07XG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZW9mIGhhbmRsZXIgPT09IFwib2JqZWN0XCIpe1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoaGFuZGxlci5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlSW50ZXJjZXB0b3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGhhbmRsZXIuYWxsb3dJbnRlcmNlcHRvckVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IFxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSBpbnRlcmNlcHRvciBpZiBleGlzdHNcblx0XHRcdFx0XHRcdFx0aWYoIWlnbm9yZUludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaW50ZXJjZXB0b3JSZXN1bHQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5vcHRpb25zLmludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRcdGludGVyY2VwdG9yUmVzdWx0PWF3YWl0IHRoaXMub3B0aW9ucy5pbnRlcmNlcHRvci5leGVjdXRlKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGludGVyY2VwdG9yUmVzdWx0LmVycm9yICYmICFhbGxvd0ludGVyY2VwdG9yRXJyb3Ipe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsaW50ZXJjZXB0b3JSZXN1bHQsdG1lLGVwLGxvZyxodHRwUmVxdWVzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LmludGVyY2VwdG9yUmVzdWx0ID0gaW50ZXJjZXB0b3JSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBQcmVjaGVjayBXSFk/XG5cdFx0XHRcdFx0XHRcdGlmKGkgPT09IHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHRodHRwUmVxdWVzdC5wcmVjaGVjaz17ZGF0YTp0aGlzLm9wdGlvbnMubW9uaXRvcn1cblxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmVjaGVjaz1hd2FpdCBpLnByZWNoZWNrKGh0dHBSZXF1ZXN0KVxuXHRcdFx0XHRcdFx0XHRpZihwcmVjaGVjayAmJiBwcmVjaGVjay5lcnJvcil7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHByZWNoZWNrLHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LnByZWNoZWNrPXByZWNoZWNrO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgaW50ZXJjZXB0b3IgaGFzIG5vIGVycm9ycywgZXhlY3V0ZSBtYWluIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgaS5leGVjdXRlKGh0dHBSZXF1ZXN0KVxuXG5cblx0XHRcdFx0XHRcdFx0IFxuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKGUpXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUZhdGFsRXJyb3IoZXApO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgZXJyb3IgaXMgSUVycm9yXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhOlRyYW5zZmVyUGFja2V0Vk8gPSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29kZToxMDAwMixcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6XCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGV0YWlsczpgJHtlfWBcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZihFcnJvclV0aWxzLmlzRXJyb3IoZSkpXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IHtlcnJvcjplIGFzIElFcnJvcn1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsZGF0YSx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHJlc3VsdCx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRleGVjdXRlKClcblx0XHRcdFx0fSk7Ly8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RcblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcblxuXHRcdC8vIGZpbmFsIGhhbmRsZXJcblx0XHRhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuXHRcdFx0XG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKVxuXG5cdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Ly9jaGVjayBpZiByZXF1ZXN0aW5nIG1vbml0b3Jcblx0XHRcdFx0aWYocmVxLm1ldGhvZD09PVwiR0VUXCIpe1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGxldCBtb25pdG9yUmVxdWVzdD1mYWxzZTtcblx0XHRcdFx0XHRmb3IobGV0IGkgb2YgdGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdFx0XHRpZihyZXEub3JpZ2luYWxVcmwuZW5kc1dpdGgoXCIvc20tXCIraGFzaCkpe1xuXHRcdFx0XHRcdFx0XHRtb25pdG9yUmVxdWVzdD10cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZihtb25pdG9yUmVxdWVzdCl7XG5cdFx0XHRcdFx0XHQvLyBzZW5kIGluZGV4IFRodSwgMTYgTm92IDIwMjMgMjM6MzM6MzUgR01UXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMubW9uaXRvckluZGV4RmlsZSlcblx0XHRcdFx0XHRcdFx0dGhpcy5tb25pdG9ySW5kZXhGaWxlID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsXCJtb25pdG9yXCIsXCJpbmRleC5odG1sXCIpKTtcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLFwidGV4dC9odG1sXCIpXG5cdFx0XHRcdFx0XHRcdHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiLHRoaXMubW9uaXRvckluZGV4RmlsZS5ieXRlTGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRyZXMuc3RhdHVzKDIwMCkuc2VuZCh0aGlzLm1vbml0b3JJbmRleEZpbGUpO1xuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOntcblx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6MTAwMDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzOmAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcdFx0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdFxuXHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0ZXJyb3I6RGVmYXVsdEVycm9ycy5VTktOT1dOX1JFUVVFU1QsXG5cdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0aHR0cFN0YXR1czo0MDRcblx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcblx0XHR9KVxuXG5cdFx0c2VydmVyLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSlcblxuXHRcdC8qYXBwLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSkqL1xuXHR9XG5cblx0YXN5bmMgc2VuZFJlc3BvbnNlKHJlZjpzdHJpbmcscmVzOlJlc3BvbnNlLGRhdGE6VHJhbnNmZXJQYWNrZXRWTzxhbnk+LHJlcXVlc3RUaW1lOm51bWJlcixlbmRwb2ludD86c3RyaW5nLGxvZz86QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtfG51bGwscmVxPzpIVFRQUmVxdWVzdFZPKXtcblxuXHRcdGlmKGRhdGEuYmxvY2tSZXNwb25zZSl7XG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiUmVzcG9uc2UgYmxvY2tlZFwiXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYocmVxICYmIHJlcS5zdHJlYW0pe1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLnBvc3Rwcm9kdWNlcil7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGRhdGEgPSBhd2FpdCB0aGlzLm9wdGlvbnMucG9zdHByb2R1Y2VyKHJlcSxyZXMsZGF0YSxyZXF1ZXN0VGltZSxlbmRwb2ludCxsb2cpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRsb2dFcnJvcihcIlBvc3Rwcm9kdWNlciBlcnJvclwiLGUpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYoRXJyb3JVdGlscy5pc0Vycm9yKGRhdGEpKVxuXHRcdFx0ZGF0YSA9IHtlcnJvcjpkYXRhIGFzIElFcnJvcixkYXRhOm51bGx9XG5cdFx0XG4gICAgICAgIGRhdGEucmVzcG9uc2VUaW1lID0gKCtuZXcgRGF0ZSgpKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICBkYXRhLmNvcmUgPSB0aGlzLnZlcnNpb25cbiAgICAgICAgZGF0YS5lbmRwb2ludCA9IGVuZHBvaW50ID8/IFwibm9fZW5kcG9pbnRcIlxuXHRcdFxuXHRcdGlmKHRoaXMub3B0aW9ucy5hcHBWZXJzaW9uKVxuXHRcdFx0ZGF0YS52ZXJzaW9uPXRoaXMub3B0aW9ucy5hcHBWZXJzaW9uXG5cblx0XHRcblx0XHRpZihsb2cpe1xuXHRcdFx0bG9nLnRpbWUgPSBkYXRhLnJlc3BvbnNlVGltZVxuXHRcdFx0bG9nLnJlZmVyZXI9cmVmO1xuXHRcdH1cblxuXHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdHRoaXMubW9uaXRvci5yZWdpc3RyYXRlUmVzcG9uc2UoZGF0YS5lbmRwb2ludCxkYXRhLnJlc3BvbnNlVGltZSlcblxuICAgICAgICBpZihyZXMuZGVzdHJveWVkIHx8IHJlcy5jbG9zZWQpe1xuXG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCwgY2FuJ3Qgc2VuZCByZXNwb25zZSBmb3I6IFwiK2RhdGEuZW5kcG9pbnRcblx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuICAgICAgICAgICAgXHR0aGlzLm9wdGlvbnMub25FcnJvcihcIkNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQsIGNhbid0IHNlbmQgcmVzcG9uc2U6IFwiK2RhdGEuZW5kcG9pbnQsZGF0YSlcbiAgICAgICAgICAgIFxuXHRcdFx0aWYodGhpcy5tb25pdG9yKVxuXHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG4gICAgICAgIH1lbHNle1xuXHRcdFx0dHJ5e1xuXG5cdFx0XHRcdGlmKGRhdGEuZmlsZSl7XG5cblx0XHRcdFx0XHRyZXMuc2VuZEZpbGUoZGF0YS5maWxlLGVycj0+e1xuXHRcdFx0XHRcdFx0aWYoZXJyKXtcblx0XHRcdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0XHRcdGxvZy5lcnJvciA9IFwiQ2FuJ3Qgc2VuZCBmaWxlOiBcIitkYXRhLmZpbGVcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgZGF0YS5lbmRwb2ludClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlZixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOkRlZmF1bHRFcnJvcnMuQ0FOVF9TRU5EX0ZJTEUsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0scmVxdWVzdFRpbWUsZGF0YS5lbmRwb2ludCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9KVxuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZihkYXRhLnJlZGlyZWN0KXtcblx0XHRcdFx0XHRyZXMucmVkaXJlY3QoZGF0YS5yZWRpcmVjdCk7XG5cdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0ge3JlZGlyZWN0OmRhdGEucmVkaXJlY3R9XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vIHNldHVwIGhlYWRlcnNcblx0XHRcdFx0XHRpZihkYXRhLmhlYWRlcnMpe1xuXHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIGRhdGEuaGVhZGVycylcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihpLGRhdGEuaGVhZGVyc1tpXSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLmh0dHBTdGF0dXMgJiYgZGF0YS5lcnJvci5odHRwU3RhdHVzPjk5KVxuXHRcdFx0XHRcdFx0cmVzLnN0YXR1c0NvZGUgPSBkYXRhLmVycm9yLmh0dHBTdGF0dXNcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXMuc3RhdHVzQ29kZT1kYXRhLmh0dHBTdGF0dXMgPz8gMjAwXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYoZGF0YS5yYXdSZXNwb25zZSl7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhLmRhdGEpXG5cdFx0XHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0XHRcdGxvZy5yZXNwb25zZSA9IHRoaXMuY2hlY2tEYXRhTGVuZ3RoKGRhdGEpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhKTtcblx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0gdGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YSlcblxuXHRcdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiB0aGlzLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpXG5cdFx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0XHRsb2cuZXJyb3IgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9Y2F0Y2goZSl7XG5cdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKFwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiLGUpO1xuXHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0bG9nLmVycm9yPVwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiXG5cdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHNob3cgbG9nXG5cdFx0aWYobG9nICYmIGxvZy5lcnJvciAmJiB0aGlzLm9wdGlvbnMub25FcnJvcil7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25FcnJvcihsb2cuZXJyb3IpXG5cdFx0fWVsc2V7XG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0fVxuICAgIH1cblxuXG5cdGNoZWNrRGF0YUxlbmd0aChkYXRhOmFueSxyZXN1bHQ/OmFueSxsdmw/Om51bWJlcik6YW55e1xuXHRcdFxuXHRcdGlmKCFsdmwpXG5cdFx0XHRsdmw9MDtcblxuXHRcdGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKXtcblx0XHRcdGlmKHR5cGVvZiBkYXRhPT09XCJzdHJpbmdcIiAmJiBkYXRhLmxlbmd0aD4xMDI0KVxuXHRcdFx0XHRyZXR1cm4gZGF0YS5zdWJzdHJpbmcoMCwxMDAwKStcIi4uLiAodG90YWw6XCIgKyBkYXRhLmxlbmd0aCArIFwiKVwiXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIil7XG5cdFx0XHRpZighcmVzdWx0KVxuXHRcdFx0XHRyZXN1bHQ9e307XG5cdFx0XHRsZXQgYXJyY250ID0gMTAwO1xuXHRcdFx0Zm9yKGxldCBpIGluIGRhdGEpe1xuXHRcdFx0XHRyZXN1bHRbaV09dGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YVtpXSxyZXN1bHRbaV0sbHZsKzEpO1xuXHRcdFx0XHRhcnJjbnQtLTtcblx0XHRcdFx0aWYoYXJyY250PD0wKXtcblx0XHRcdFx0XHRyZXN1bHRbXCIuLi5cIl09XCIuLi4gdG90YWw6IFwiK0FycmF5LmlzQXJyYXkoZGF0YSk/ZGF0YS5sZW5ndGg6T2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQgPz8gbnVsbDtcblx0fVxuXG59XG4iXX0=
@@ -7,6 +7,7 @@ export declare class BaseService implements IBaseService {
7
7
  protected name: string;
8
8
  constructor(name: string);
9
9
  init(): Promise<void>;
10
+ finishService(): Promise<void>;
10
11
  getName(): string;
11
12
  applicationReady(): void;
12
13
  }
@@ -8,6 +8,17 @@ class BaseService {
8
8
  }
9
9
  async init() {
10
10
  console.log("Service: " + this.name + " initialized");
11
+ process.on('SIGINT', async () => {
12
+ await this.finishService();
13
+ process.exit(0);
14
+ });
15
+ process.on('SIGTERM', async () => {
16
+ await this.finishService();
17
+ process.exit(0);
18
+ });
19
+ }
20
+ async finishService() {
21
+ console.log("Service: " + this.name + " finished -- not implemented --");
11
22
  }
12
23
  getName() {
13
24
  return this.name;
@@ -15,4 +26,4 @@ class BaseService {
15
26
  applicationReady() { }
16
27
  }
17
28
  exports.BaseService = BaseService;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpU2VydmVyL0Jhc2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQWEsV0FBVztJQUVaLElBQUksQ0FBUTtJQUN0QixZQUFhLElBQVk7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUMsSUFBSSxDQUFDLElBQUksR0FBQyxjQUFjLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsZ0JBQWdCLEtBQVksQ0FBQztDQUM5QjtBQWhCRCxrQ0FnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElCYXNlU2VydmljZSB7XG4gIGluaXQ6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgYXBwbGljYXRpb25SZWFkeTogKCkgPT4gdm9pZFxuICBnZXROYW1lOiAoKSA9PiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VTZXJ2aWNlIGltcGxlbWVudHMgSUJhc2VTZXJ2aWNlIHtcblxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gIH1cblxuICBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHsgXG4gICAgY29uc29sZS5sb2coXCJTZXJ2aWNlOiBcIit0aGlzLm5hbWUrXCIgaW5pdGlhbGl6ZWRcIik7XG4gIH1cbiAgXG4gIGdldE5hbWUoKTpzdHJpbmd7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIGFwcGxpY2F0aW9uUmVhZHkgKCk6IHZvaWQgeyB9XG59XG4iXX0=
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpU2VydmVyL0Jhc2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQWEsV0FBVztJQUVaLElBQUksQ0FBUTtJQUN0QixZQUFhLElBQVk7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUMsSUFBSSxDQUFDLElBQUksR0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBR0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUMsS0FBSyxJQUFJLEVBQUU7WUFDOUIsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBQyxJQUFJLENBQUMsSUFBSSxHQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGdCQUFnQixLQUFZLENBQUM7Q0FDOUI7QUE5QkQsa0NBOEJDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJQmFzZVNlcnZpY2Uge1xuICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIGFwcGxpY2F0aW9uUmVhZHk6ICgpID0+IHZvaWRcbiAgZ2V0TmFtZTogKCkgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCYXNlU2VydmljZSBpbXBsZW1lbnRzIElCYXNlU2VydmljZSB7XG5cbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZ1xuICBjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICB9XG5cbiAgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7IFxuICAgIGNvbnNvbGUubG9nKFwiU2VydmljZTogXCIrdGhpcy5uYW1lK1wiIGluaXRpYWxpemVkXCIpO1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoU2VydmljZSgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgIC8vIHRlcm1pbmF0ZSAoa2lsbClcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJyxhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaFNlcnZpY2UoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgYXN5bmMgZmluaXNoU2VydmljZSAoKXtcbiAgICBjb25zb2xlLmxvZyhcIlNlcnZpY2U6IFwiK3RoaXMubmFtZStcIiBmaW5pc2hlZCAtLSBub3QgaW1wbGVtZW50ZWQgLS1cIik7XG4gIH1cblxuICBnZXROYW1lKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBhcHBsaWNhdGlvblJlYWR5ICgpOiB2b2lkIHsgfVxufVxuIl19
@@ -1,11 +1,61 @@
1
1
  import { Req } from "badmfck-signal";
2
2
  import { BaseService } from "./BaseService";
3
- export interface IDBSelectRequest {
3
+ import { IDBAdapter } from "./db/IDBAdapter";
4
+ export interface IDBQueryField extends Record<string, string | number | boolean | null | undefined | {
5
+ name?: string | null;
6
+ value: string | number | boolean | null | undefined;
7
+ system?: boolean;
8
+ ignoreInInsert?: boolean;
9
+ ignoreInUpdate?: boolean;
10
+ useInReplace?: boolean;
11
+ __parsedValue?: string | number | boolean | null | undefined;
12
+ }> {
4
13
  }
5
- export interface IDBSelectResponse {
14
+ export interface IDBQuery {
15
+ dbid?: string;
16
+ query: string;
17
+ fields?: IDBQueryField;
18
+ throwable?: boolean;
19
+ transactionID?: number;
20
+ calculateCount?: boolean;
6
21
  }
7
- export declare const DB_SELECT: Req<IDBSelectRequest, IDBSelectResponse>;
8
- export declare class DBService extends BaseService {
22
+ export interface IDBError {
23
+ code: string;
24
+ errno: number;
25
+ fatal: boolean;
26
+ sql: string;
27
+ name: string;
28
+ message: string;
29
+ }
30
+ export interface IDBResult {
31
+ data?: any | null;
32
+ error?: IDBError | null;
33
+ }
34
+ export interface IDBSericeOptions {
9
35
  id: string;
10
- constructor(id: string);
36
+ type: "mysql" | "postgres";
37
+ connection: DBAdapterOptions;
38
+ }
39
+ export interface DBAdapterOptions {
40
+ connectionLimit: number;
41
+ host: string;
42
+ user: string;
43
+ password: string;
44
+ port: number;
45
+ database: string;
46
+ queueLimit?: number;
47
+ transactionFailReport?: (trx: any, message: string) => void;
48
+ transactionFailReportDir?: string;
49
+ naxTransactionWaitTime?: number;
50
+ debug?: boolean;
51
+ }
52
+ export declare const REQ_DB: Req<IDBQuery, IDBResult>;
53
+ export declare class DBService extends BaseService {
54
+ static allInstances: DBService[];
55
+ options: IDBSericeOptions;
56
+ adapter: IDBAdapter | null;
57
+ constructor(options: IDBSericeOptions);
58
+ init(): Promise<void>;
59
+ finishService(): Promise<void>;
60
+ createMysqlDatabase(): Promise<void>;
11
61
  }
@@ -1,15 +1,57 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DBService = exports.DB_SELECT = void 0;
3
+ exports.DBService = exports.REQ_DB = void 0;
4
4
  const badmfck_signal_1 = require("badmfck-signal");
5
5
  const BaseService_1 = require("./BaseService");
6
- exports.DB_SELECT = new badmfck_signal_1.Req(undefined, "DB_SELECT");
6
+ const MysqlAdapter_1 = require("./db/MysqlAdapter");
7
+ exports.REQ_DB = new badmfck_signal_1.Req(undefined, "DB_SELECT");
7
8
  class DBService extends BaseService_1.BaseService {
8
- id;
9
- constructor(id) {
9
+ static allInstances = [];
10
+ options;
11
+ adapter = null;
12
+ constructor(options) {
10
13
  super("DB Service");
11
- this.id = id;
14
+ this.options = options;
15
+ if (DBService.allInstances.length > 0) {
16
+ for (let i of DBService.allInstances) {
17
+ if (i.options.id === options.id)
18
+ throw { code: -1, message: "DBService duplicate id: " + options.id };
19
+ }
20
+ }
21
+ DBService.allInstances.push(this);
22
+ }
23
+ async init() {
24
+ super.init();
25
+ if (this.options.type === "mysql") {
26
+ await this.createMysqlDatabase();
27
+ }
28
+ exports.REQ_DB.listener = async (req) => {
29
+ if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter)
30
+ return DBService.allInstances[0].adapter.query(req);
31
+ for (let i of DBService.allInstances) {
32
+ if (i.options.id === req.dbid && i.adapter)
33
+ return i.adapter.query(req);
34
+ }
35
+ const error = {
36
+ code: "DB_NOT_FOUND",
37
+ errno: -1,
38
+ fatal: true,
39
+ sql: "",
40
+ name: "DB_NOT_FOUND",
41
+ message: "DB not found: " + req.dbid
42
+ };
43
+ if (req.throwable)
44
+ throw error;
45
+ return { error: error };
46
+ };
47
+ }
48
+ async finishService() {
49
+ await this.adapter?.finish();
50
+ }
51
+ async createMysqlDatabase() {
52
+ this.adapter = new MysqlAdapter_1.MysqlAdapter(this.options.connection);
53
+ await this.adapter.init();
12
54
  }
13
55
  }
14
56
  exports.DBService = DBService;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiREJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaVNlcnZlci9EQlNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQXFDO0FBQ3JDLCtDQUE0QztBQUsvQixRQUFBLFNBQVMsR0FBQyxJQUFJLG9CQUFHLENBQXFDLFNBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQztBQUUxRixNQUFhLFNBQVUsU0FBUSx5QkFBVztJQUN0QyxFQUFFLENBQU87SUFDVCxZQUFZLEVBQVM7UUFDakIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQU5ELDhCQU1DIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBSZXEgfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIjtcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSBcIi4vQmFzZVNlcnZpY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJREJTZWxlY3RSZXF1ZXN0e31cbmV4cG9ydCBpbnRlcmZhY2UgSURCU2VsZWN0UmVzcG9uc2V7fVxuXG5leHBvcnQgY29uc3QgREJfU0VMRUNUPW5ldyBSZXE8SURCU2VsZWN0UmVxdWVzdCxJREJTZWxlY3RSZXNwb25zZT4odW5kZWZpbmVkLFwiREJfU0VMRUNUXCIpO1xuXG5leHBvcnQgY2xhc3MgREJTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xuICAgIGlkOnN0cmluZ1xuICAgIGNvbnN0cnVjdG9yKGlkOnN0cmluZykge1xuICAgICAgICBzdXBlcihcIkRCIFNlcnZpY2VcIik7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICB9XG59Il19
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiREJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaVNlcnZlci9EQlNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQXFDO0FBQ3JDLCtDQUE0QztBQUc1QyxvREFBaUQ7QUEwRHBDLFFBQUEsTUFBTSxHQUFDLElBQUksb0JBQUcsQ0FBcUIsU0FBUyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXZFLE1BQWEsU0FBVSxTQUFRLHlCQUFXO0lBRXRDLE1BQU0sQ0FBQyxZQUFZLEdBQWUsRUFBRSxDQUFDO0lBRXJDLE9BQU8sQ0FBa0I7SUFDekIsT0FBTyxHQUFtQixJQUFJLENBQUM7SUFDL0IsWUFBWSxPQUF3QjtRQUNoQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBQyxPQUFPLENBQUM7UUFDckIsSUFBRyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7WUFDL0IsS0FBSSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFDO2dCQUNoQyxJQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixNQUFNLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQywwQkFBMEIsR0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLENBQUE7YUFDcEU7U0FDSjtRQUNELFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUcsT0FBTyxFQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7U0FDbkM7UUFFRCxjQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUMsRUFBRTtZQUUzQixJQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUNsRixPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUd4RCxLQUFJLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUM7Z0JBQ2hDLElBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTztvQkFDckMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNuQztZQUVELE1BQU0sS0FBSyxHQUFHO2dCQUNWLElBQUksRUFBQyxjQUFjO2dCQUNuQixLQUFLLEVBQUMsQ0FBQyxDQUFDO2dCQUNSLEtBQUssRUFBQyxJQUFJO2dCQUNWLEdBQUcsRUFBQyxFQUFFO2dCQUNOLElBQUksRUFBQyxjQUFjO2dCQUNuQixPQUFPLEVBQUMsZ0JBQWdCLEdBQUMsR0FBRyxDQUFDLElBQUk7YUFDcEMsQ0FBQTtZQUVELElBQUcsR0FBRyxDQUFDLFNBQVM7Z0JBQ1osTUFBTSxLQUFLLENBQUM7WUFDaEIsT0FBTyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsQ0FBQztRQUN6QixDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWE7UUFDZixNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDJCQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDN0IsQ0FBQzs7QUF6REwsOEJBNERDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBSZXEgfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIjtcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSBcIi4vQmFzZVNlcnZpY2VcIjtcbmltcG9ydCB7IG9mZiB9IGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyBJREJBZGFwdGVyIH0gZnJvbSBcIi4vZGIvSURCQWRhcHRlclwiO1xuaW1wb3J0IHsgTXlzcWxBZGFwdGVyIH0gZnJvbSBcIi4vZGIvTXlzcWxBZGFwdGVyXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJREJRdWVyeUZpZWxkIGV4dGVuZHMgUmVjb3JkPHN0cmluZyxzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR8e1xuICAgIG5hbWU/OnN0cmluZ3xudWxsLFxuICAgIHZhbHVlOnN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsfHVuZGVmaW5lZCxcbiAgICBzeXN0ZW0/OmJvb2xlYW4sXG4gICAgaWdub3JlSW5JbnNlcnQ/OmJvb2xlYW4sXG4gICAgaWdub3JlSW5VcGRhdGU/OmJvb2xlYW4sXG4gICAgdXNlSW5SZXBsYWNlPzpib29sZWFuXG5cbiAgICBfX3BhcnNlZFZhbHVlPzpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWRcbn0+e31cblxuZXhwb3J0IGludGVyZmFjZSBJREJRdWVyeXtcbiAgICBkYmlkPzpzdHJpbmcsXG4gICAgcXVlcnk6c3RyaW5nLFxuICAgIGZpZWxkcz86SURCUXVlcnlGaWVsZFxuICAgIHRocm93YWJsZT86Ym9vbGVhblxuICAgIHRyYW5zYWN0aW9uSUQ/Om51bWJlclxuICAgIGNhbGN1bGF0ZUNvdW50Pzpib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCRXJyb3J7XG4gICAgY29kZTogc3RyaW5nLFxuICAgIGVycm5vOiBudW1iZXIsXG4gICAgZmF0YWw6IGJvb2xlYW4sXG4gICAgc3FsOiBzdHJpbmcsXG4gICAgbmFtZTpzdHJpbmcsXG4gICAgbWVzc2FnZTpzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCUmVzdWx0e1xuICAgIGRhdGE/OmFueXxudWxsLFxuICAgIGVycm9yPzpJREJFcnJvcnxudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCU2VyaWNlT3B0aW9uc3tcbiAgICBpZDpzdHJpbmcsXG4gICAgdHlwZTpcIm15c3FsXCJ8XCJwb3N0Z3Jlc1wiLFxuICAgIGNvbm5lY3Rpb246REJBZGFwdGVyT3B0aW9ucyBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEQkFkYXB0ZXJPcHRpb25ze1xuICAgIGNvbm5lY3Rpb25MaW1pdDpudW1iZXIsXG4gICAgaG9zdDpzdHJpbmcsXG4gICAgdXNlcjpzdHJpbmcsXG4gICAgcGFzc3dvcmQ6c3RyaW5nLFxuICAgIHBvcnQ6bnVtYmVyLFxuICAgIGRhdGFiYXNlOnN0cmluZywgIFxuICAgIHF1ZXVlTGltaXQ/Om51bWJlcixcbiAgICB0cmFuc2FjdGlvbkZhaWxSZXBvcnQ/Oih0cng6YW55LG1lc3NhZ2U6c3RyaW5nKT0+dm9pZCxcbiAgICB0cmFuc2FjdGlvbkZhaWxSZXBvcnREaXI/OnN0cmluZyxcbiAgICBuYXhUcmFuc2FjdGlvbldhaXRUaW1lPzpudW1iZXIsXG4gICAgZGVidWc/OmJvb2xlYW5cblxufVxuXG5leHBvcnQgY29uc3QgUkVRX0RCPW5ldyBSZXE8SURCUXVlcnksSURCUmVzdWx0Pih1bmRlZmluZWQsXCJEQl9TRUxFQ1RcIik7XG5cbmV4cG9ydCBjbGFzcyBEQlNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cbiAgICBzdGF0aWMgYWxsSW5zdGFuY2VzOkRCU2VydmljZVtdID0gW107XG5cbiAgICBvcHRpb25zOklEQlNlcmljZU9wdGlvbnM7XG4gICAgYWRhcHRlcjpJREJBZGFwdGVyfG51bGwgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6SURCU2VyaWNlT3B0aW9ucykge1xuICAgICAgICBzdXBlcihcIkRCIFNlcnZpY2VcIik7XG4gICAgICAgIHRoaXMub3B0aW9ucz1vcHRpb25zO1xuICAgICAgICBpZihEQlNlcnZpY2UuYWxsSW5zdGFuY2VzLmxlbmd0aD4wKXtcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzKXtcbiAgICAgICAgICAgICAgICBpZihpLm9wdGlvbnMuaWQgPT09IG9wdGlvbnMuaWQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHtjb2RlOi0xLG1lc3NhZ2U6XCJEQlNlcnZpY2UgZHVwbGljYXRlIGlkOiBcIitvcHRpb25zLmlkfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIERCU2VydmljZS5hbGxJbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCl7XG4gICAgICAgIHN1cGVyLmluaXQoKTtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnR5cGU9PT1cIm15c3FsXCIpe1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVNeXNxbERhdGFiYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIFJFUV9EQi5saXN0ZW5lciA9IGFzeW5jIChyZXEpPT57XG4gICAgICAgICAgICAvLyBvbmx5IG9uZSBkYiBpbnN0YW5jZVxuICAgICAgICAgICAgaWYoIXJlcS5kYmlkICYmIERCU2VydmljZS5hbGxJbnN0YW5jZXMubGVuZ3RoPT09MSAmJiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzWzBdLmFkYXB0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIERCU2VydmljZS5hbGxJbnN0YW5jZXNbMF0uYWRhcHRlci5xdWVyeShyZXEpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSBkYiBpbnN0YW5jZXNcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzKXtcbiAgICAgICAgICAgICAgICBpZihpLm9wdGlvbnMuaWQgPT09IHJlcS5kYmlkICYmIGkuYWRhcHRlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRhcHRlci5xdWVyeShyZXEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICBjb2RlOlwiREJfTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgICAgICAgZXJybm86LTEsXG4gICAgICAgICAgICAgICAgZmF0YWw6dHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6XCJcIixcbiAgICAgICAgICAgICAgICBuYW1lOlwiREJfTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcIkRCIG5vdCBmb3VuZDogXCIrcmVxLmRiaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYocmVxLnRocm93YWJsZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB7ZXJyb3I6ZXJyb3J9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmluaXNoU2VydmljZSgpe1xuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXI/LmZpbmlzaCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZU15c3FsRGF0YWJhc2UoKXtcbiAgICAgICAgdGhpcy5hZGFwdGVyID0gbmV3IE15c3FsQWRhcHRlcih0aGlzLm9wdGlvbnMuY29ubmVjdGlvbilcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmluaXQoKVxuICAgIH1cblxuXG59Il19
@@ -0,0 +1,7 @@
1
+ import { IDBQuery, IDBResult } from "../DBService";
2
+ export interface IDBAdapter {
3
+ init(): Promise<void>;
4
+ finish(): Promise<void>;
5
+ prepareQuery(request: IDBQuery): string;
6
+ query(request: IDBQuery): Promise<IDBResult>;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSURCQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvZGIvSURCQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURCUXVlcnksIElEQlJlc3VsdCB9IGZyb20gXCIuLi9EQlNlcnZpY2VcIlxuXG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIElEQkFkYXB0ZXJ7XG4gICAgaW5pdCgpOlByb21pc2U8dm9pZD5cbiAgICBmaW5pc2goKTpQcm9taXNlPHZvaWQ+XG4gICAgcHJlcGFyZVF1ZXJ5KHJlcXVlc3Q6SURCUXVlcnkpOnN0cmluZ1xuICAgIHF1ZXJ5KHJlcXVlc3Q6SURCUXVlcnkpOlByb21pc2U8SURCUmVzdWx0PlxufSJdfQ==
@@ -0,0 +1,45 @@
1
+ /// <reference types="node" />
2
+ import { DBAdapterOptions, IDBError, IDBQuery, IDBQueryField, IDBResult } from "../DBService";
3
+ import { IDBAdapter } from "./IDBAdapter";
4
+ import mysql from 'mysql2/promise';
5
+ import fs from 'fs';
6
+ interface ITransaction {
7
+ id: number;
8
+ timestamp: number;
9
+ conn: mysql.PoolConnection;
10
+ queries: {
11
+ sql: string;
12
+ status: string;
13
+ }[];
14
+ }
15
+ export declare class MysqlAdapter implements IDBAdapter {
16
+ options: DBAdapterOptions;
17
+ serviceStarted: boolean;
18
+ reconnectionTimeout: number;
19
+ reconnecting: boolean;
20
+ pool: mysql.Pool | null;
21
+ timeoutID: any;
22
+ queries: never[];
23
+ static nextTransactionID: number;
24
+ transactions: ITransaction[];
25
+ maxTransactionWaitTime: number;
26
+ lastSuccessQueryTime: number;
27
+ pingInterval: number;
28
+ failReportFileStream: fs.WriteStream | null;
29
+ failReportFileStreamName: string | null;
30
+ failReportLastAccessTime: number;
31
+ constructor(options: DBAdapterOptions);
32
+ init(): Promise<void>;
33
+ setupTimers(): void;
34
+ recreatePool(): Promise<boolean>;
35
+ query(request: IDBQuery): Promise<IDBResult>;
36
+ prepareQuery(request: IDBQuery): string;
37
+ static prepareQueryFieldValue(field: IDBQueryField): string | number | boolean | null | undefined;
38
+ prepareCountQuery(query: string): string;
39
+ commit(trx: ITransaction): Promise<IDBError | null>;
40
+ rollbackTransaction(trx: ITransaction, donNotRemove?: boolean): Promise<IDBError | null>;
41
+ finish(): Promise<void>;
42
+ createMysqlQueryError(err: any, throwable?: boolean): IDBError;
43
+ storeTransactionAsProblem(trx: ITransaction, message: string): Promise<void>;
44
+ }
45
+ export {};
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MysqlAdapter = void 0;
7
+ const promise_1 = __importDefault(require("mysql2/promise"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const LogService_1 = require("../LogService");
10
+ const DefaultErrors_1 = __importDefault(require("../structures/DefaultErrors"));
11
+ const path_1 = __importDefault(require("path"));
12
+ class MysqlAdapter {
13
+ options;
14
+ serviceStarted = false;
15
+ reconnectionTimeout = 1000 * 3;
16
+ reconnecting = false;
17
+ pool = null;
18
+ timeoutID;
19
+ queries = [];
20
+ static nextTransactionID = 1;
21
+ transactions = [];
22
+ maxTransactionWaitTime = 1000 * 60 * 1;
23
+ lastSuccessQueryTime = 0;
24
+ pingInterval = 1000 * 60 * 2;
25
+ failReportFileStream = null;
26
+ failReportFileStreamName = null;
27
+ failReportLastAccessTime = 0;
28
+ constructor(options) {
29
+ this.options = options;
30
+ }
31
+ async init() {
32
+ if (this.options.transactionFailReportDir) {
33
+ try {
34
+ if (!fs_1.default.existsSync(this.options.transactionFailReportDir))
35
+ fs_1.default.mkdirSync(this.options.transactionFailReportDir);
36
+ }
37
+ catch (e) {
38
+ this.options.transactionFailReportDir = undefined;
39
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't create transaction fail report dir");
40
+ }
41
+ }
42
+ this.serviceStarted = false;
43
+ let poolCreated = false;
44
+ while (!poolCreated) {
45
+ poolCreated = await this.recreatePool();
46
+ if (!poolCreated) {
47
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL! Retrying in 3 seconds...");
48
+ await new Promise((resolve) => setTimeout(resolve, 3000));
49
+ }
50
+ }
51
+ this.setupTimers();
52
+ }
53
+ setupTimers() {
54
+ setInterval(() => {
55
+ const now = Date.now();
56
+ const count = this.transactions.length;
57
+ const removedIDs = [];
58
+ for (let i of this.transactions) {
59
+ if (now - i.timestamp > this.maxTransactionWaitTime) {
60
+ (0, LogService_1.logError)("Release transaction connection due to timeout");
61
+ this.rollbackTransaction(i, true);
62
+ removedIDs.push(i.id);
63
+ }
64
+ }
65
+ this.transactions = this.transactions.filter(i => !removedIDs.includes(i.id));
66
+ if (this.options.debug && count - this.transactions.length > 0)
67
+ console.log("Removed: ", count - this.transactions.length);
68
+ if (Date.now() - this.lastSuccessQueryTime > this.pingInterval) {
69
+ if (!this.pool)
70
+ return;
71
+ for (let i = 0; i < this.options.connectionLimit; i++) {
72
+ this.query({ query: "SELECT 1 @NOLIMIT" });
73
+ if (this.options.debug)
74
+ console.log("Ping mysql on each connection in pool");
75
+ }
76
+ }
77
+ }, 1000 * 30);
78
+ setInterval(() => {
79
+ if (!this.failReportFileStream)
80
+ return;
81
+ if (Date.now() - this.failReportLastAccessTime > 1000 * 60 * 15) {
82
+ this.failReportFileStream.end();
83
+ this.failReportFileStream = null;
84
+ }
85
+ }, 1000 * 60 * 5);
86
+ }
87
+ async recreatePool() {
88
+ (0, LogService_1.logInfo)("${MysqlAdapter.js}", "Connecting to mysql: \n " + JSON.stringify({ ...this.options, password: "****" }));
89
+ if (this.pool) {
90
+ this.pool.removeAllListeners();
91
+ try {
92
+ await this.pool.end();
93
+ }
94
+ catch (e) {
95
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
96
+ }
97
+ this.pool = null;
98
+ }
99
+ try {
100
+ this.pool = promise_1.default.createPool({
101
+ host: this.options.host,
102
+ user: this.options.user,
103
+ password: this.options.password,
104
+ database: this.options.database,
105
+ port: this.options.port,
106
+ connectionLimit: this.options.connectionLimit,
107
+ queueLimit: 10,
108
+ multipleStatements: true,
109
+ enableKeepAlive: true,
110
+ keepAliveInitialDelay: 3 * 1000,
111
+ idleTimeout: 1000 * 60 * 5
112
+ });
113
+ }
114
+ catch (e) {
115
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL! " + e);
116
+ return false;
117
+ }
118
+ this.pool?.on('connection', (connection) => {
119
+ if (this.options.debug)
120
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION CREATED");
121
+ });
122
+ this.pool?.on('acquire', (connection) => {
123
+ if (this.options.debug)
124
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ACQUIRED");
125
+ });
126
+ this.pool?.on('release', (connection) => {
127
+ if (this.options.debug)
128
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION RELEASED");
129
+ });
130
+ this.pool?.on('enqueue', () => {
131
+ if (this.options.debug)
132
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ENQUEUED");
133
+ });
134
+ if (this.options.debug)
135
+ console.log("Check mysql connection");
136
+ return new Promise(async (resolve, _) => {
137
+ try {
138
+ const conn = await this.pool?.getConnection();
139
+ if (conn) {
140
+ await conn.query("SELECT 1");
141
+ conn?.release();
142
+ (0, LogService_1.logInfo)("${MysqlService.js}", "Connected to MYSQL!");
143
+ resolve(true);
144
+ }
145
+ else
146
+ resolve(false);
147
+ }
148
+ catch (e) {
149
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL!");
150
+ resolve(false);
151
+ }
152
+ });
153
+ }
154
+ async query(request) {
155
+ const query = this.prepareQuery(request);
156
+ if (!this.pool) {
157
+ (0, LogService_1.logError)("${MysqlAdapter.js}", "No pool");
158
+ const error = {
159
+ code: "NO_POOL",
160
+ errno: 100000,
161
+ fatal: true,
162
+ sql: query,
163
+ name: "NO_POOL",
164
+ message: "Mysql pool not created",
165
+ };
166
+ if (request.throwable)
167
+ throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
168
+ return {
169
+ data: null,
170
+ error: error,
171
+ };
172
+ }
173
+ try {
174
+ let conn = null;
175
+ if (request.transactionID && request.transactionID > 0) {
176
+ conn = this.transactions.find(i => i.id === request.transactionID)?.conn ?? null;
177
+ if (this.options.debug)
178
+ console.log("Execute query on transaction: ", conn?.threadId);
179
+ }
180
+ else
181
+ conn = await this.pool.getConnection();
182
+ if (this.options.debug)
183
+ console.log("Execute query", conn?.threadId);
184
+ if (!conn) {
185
+ (0, LogService_1.logCrit)("${MysqlAdapter.js}", `No connection created!`);
186
+ const error = {
187
+ code: "NO_CONN",
188
+ errno: 100001,
189
+ fatal: true,
190
+ sql: query,
191
+ name: "NO_CONN",
192
+ message: "Mysql pool cant get connection",
193
+ };
194
+ if (request.throwable)
195
+ throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
196
+ return {
197
+ data: null,
198
+ error: error,
199
+ };
200
+ }
201
+ try {
202
+ const result = await conn.query(query);
203
+ return {
204
+ data: result[0],
205
+ error: null
206
+ };
207
+ }
208
+ catch (e) {
209
+ const error = this.createMysqlQueryError(e);
210
+ if (request.throwable)
211
+ throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
212
+ return {
213
+ data: null,
214
+ error: this.createMysqlQueryError(e),
215
+ };
216
+ }
217
+ }
218
+ catch (e) {
219
+ (0, LogService_1.logCrit)("${MysqlAdapter.js}", `Error when executing query: ${e}`);
220
+ const error = {
221
+ code: "EXEC_ERROR",
222
+ errno: 100002,
223
+ fatal: true,
224
+ sql: query,
225
+ name: "EXECUTION_ERROR",
226
+ message: e + "",
227
+ };
228
+ if (request.throwable)
229
+ throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
230
+ return {
231
+ data: null,
232
+ error: error,
233
+ };
234
+ }
235
+ }
236
+ prepareQuery(request) {
237
+ let query = request.query;
238
+ let fields = request.fields;
239
+ if (fields) {
240
+ for (let i in fields) {
241
+ const name = i;
242
+ const value = fields[i];
243
+ if (typeof value === "string")
244
+ fields[i] = { value: value, system: false };
245
+ if (value === undefined)
246
+ continue;
247
+ if (value === null)
248
+ fields[i] = { value: null, system: true };
249
+ const parsed = MysqlAdapter.prepareQueryFieldValue(value);
250
+ query = query.replaceAll("@" + name, parsed + "");
251
+ }
252
+ }
253
+ const tmp = query.toLowerCase();
254
+ if (tmp.indexOf("select") === 0 && tmp.indexOf("limit") === -1)
255
+ query += " LIMIT 100";
256
+ query = query.replaceAll("@NOLIMIT", "");
257
+ if (query.indexOf("@fields") !== -1) {
258
+ let insertFieldNames = [];
259
+ let insertFieldValues = [];
260
+ for (let i in fields) {
261
+ let f = fields[i];
262
+ if (f.ignoreInInsert)
263
+ continue;
264
+ if (!f.name)
265
+ continue;
266
+ insertFieldNames.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '`');
267
+ insertFieldValues.push(f._parsedValue);
268
+ }
269
+ query = query
270
+ .replaceAll('@fields', insertFieldNames.join(","))
271
+ .replaceAll('@values', insertFieldValues.join(","));
272
+ }
273
+ if (query.indexOf("@insert") !== -1) {
274
+ let oninsertNames = [];
275
+ let oninsertValues = [];
276
+ for (let i in fields) {
277
+ let f = fields[i];
278
+ if (f.ignoreInInsert)
279
+ continue;
280
+ oninsertNames.push((f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', ""));
281
+ oninsertValues.push(f._parsedValue);
282
+ }
283
+ query = query.replaceAll("@insert", `(${oninsertNames.join(",")}) VALUES (${oninsertValues.join(",")})`);
284
+ }
285
+ if (query.indexOf("@onupdate") !== -1) {
286
+ let onUpdate = [];
287
+ for (let i in fields) {
288
+ let f = fields[i];
289
+ if (f.ignoreInUpdate)
290
+ continue;
291
+ onUpdate.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '` = ' + f._parsedValue);
292
+ }
293
+ query = query.replaceAll("@onupdate", onUpdate.join(" , "));
294
+ }
295
+ if (query.indexOf('@onduplicate') !== -1) {
296
+ let onDuplicate = [];
297
+ for (let i in fields) {
298
+ let f = fields[i];
299
+ if (!f.useInReplace)
300
+ continue;
301
+ onDuplicate.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '` = ' + f._parsedValue);
302
+ }
303
+ query = query.replaceAll("@onduplicate", onDuplicate.join(" , "));
304
+ }
305
+ return query;
306
+ }
307
+ static prepareQueryFieldValue(field) {
308
+ let value = field.value;
309
+ let system = field.system;
310
+ if (value === null || value === undefined)
311
+ return "NULL";
312
+ if (!system && typeof value === "string")
313
+ value = value.replaceAll('"', '\\"');
314
+ field.__parsedValue = value;
315
+ return value;
316
+ }
317
+ prepareCountQuery(query) {
318
+ let countQuery = query;
319
+ if (countQuery.indexOf("LIMIT") === -1)
320
+ countQuery = countQuery.substring(0, countQuery.indexOf("LIMIT"));
321
+ if (countQuery.indexOf("ORDER") !== -1)
322
+ countQuery = countQuery.substring(0, countQuery.indexOf("ORDER"));
323
+ countQuery = countQuery.substring(countQuery.indexOf("FROM"));
324
+ countQuery = "SELECT COUNT(1) as `count` " + countQuery;
325
+ return countQuery;
326
+ }
327
+ async commit(trx) {
328
+ try {
329
+ await trx.conn.commit();
330
+ trx.conn.removeAllListeners();
331
+ trx.conn.release();
332
+ }
333
+ catch (e) {
334
+ await this.rollbackTransaction(trx);
335
+ return this.createMysqlQueryError(e);
336
+ }
337
+ return null;
338
+ }
339
+ async rollbackTransaction(trx, donNotRemove) {
340
+ let err = null;
341
+ try {
342
+ console.log("Rollback started", trx.conn.threadId);
343
+ await trx.conn.rollback();
344
+ await trx.conn.commit();
345
+ trx.conn.removeAllListeners();
346
+ trx.conn.release();
347
+ if (!donNotRemove)
348
+ this.transactions = this.transactions.filter(i => i.id !== trx.id);
349
+ if (this.options.debug)
350
+ console.log("Rollback complete", trx.conn.threadId);
351
+ }
352
+ catch (e) {
353
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't rollback transaction", trx.queries);
354
+ err = this.createMysqlQueryError(e);
355
+ }
356
+ this.storeTransactionAsProblem(trx, "rollback");
357
+ return err;
358
+ }
359
+ async finish() {
360
+ console.log("Finishing mysql service");
361
+ for (let i of this.transactions)
362
+ this.rollbackTransaction(i);
363
+ if (this.pool) {
364
+ try {
365
+ await this.pool.end();
366
+ }
367
+ catch (e) {
368
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
369
+ }
370
+ }
371
+ if (this.failReportFileStream)
372
+ this.failReportFileStream.end();
373
+ this.failReportFileStream = null;
374
+ }
375
+ createMysqlQueryError(err, throwable) {
376
+ if (err && typeof err === "object" && "code" in err && "errno" in err && "sql" in err && "name" in err && "message" in err) {
377
+ return {
378
+ code: err.code,
379
+ errno: err.errno,
380
+ sql: err.sql,
381
+ name: err.name,
382
+ message: err.message,
383
+ fatal: false
384
+ };
385
+ }
386
+ else {
387
+ return {
388
+ code: "QUERY_ERR",
389
+ errno: 100002,
390
+ fatal: true,
391
+ sql: "no query",
392
+ name: "QUERY_ERR",
393
+ message: "Error: " + (err) ? err : "",
394
+ };
395
+ }
396
+ }
397
+ async storeTransactionAsProblem(trx, message) {
398
+ if (!this.options.transactionFailReport && !this.options.transactionFailReportDir) {
399
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't report failed transaction, no report function: transactionFailReport in options, and transactionFailReportDir isnt set");
400
+ return;
401
+ }
402
+ if (this.options.transactionFailReportDir) {
403
+ const yyymmdd = new Date().toISOString().substring(0, 10).replaceAll("-", "");
404
+ const date = new Date();
405
+ const file = path_1.default.resolve(this.options.transactionFailReportDir, yyymmdd + ".json");
406
+ if (this.failReportFileStream) {
407
+ if (this.failReportFileStreamName !== file) {
408
+ this.failReportFileStream.end();
409
+ this.failReportFileStream = null;
410
+ }
411
+ }
412
+ if (this.failReportFileStreamName) {
413
+ this.failReportFileStream = fs_1.default.createWriteStream(file, { flags: 'a' });
414
+ this.failReportFileStreamName = file;
415
+ }
416
+ if (this.options.debug)
417
+ console.log("Store transaction fail report: ", file, trx.queries, message);
418
+ if (!this.failReportFileStream)
419
+ this.failReportFileStream = fs_1.default.createWriteStream(file, { flags: 'a' });
420
+ this.failReportFileStream.write(JSON.stringify({ queries: trx.queries, time: trx.timestamp, date, message }) + "\n}EOB{\n", err => {
421
+ if (err)
422
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't write to transaction fail report file");
423
+ else
424
+ (0, LogService_1.logInfo)("${MysqlService.js}", "Transaction fail report stored");
425
+ });
426
+ this.failReportLastAccessTime = Date.now();
427
+ }
428
+ if (this.options.transactionFailReport)
429
+ this.options.transactionFailReport(trx, message);
430
+ }
431
+ }
432
+ exports.MysqlAdapter = MysqlAdapter;
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaVNlcnZlci9kYi9NeXNxbEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQW1DO0FBQ25DLDRDQUFvQjtBQUNwQiw4Q0FBMkQ7QUFDM0QsZ0ZBQXdEO0FBQ3hELGdEQUF3QjtBQVV4QixNQUFhLFlBQVk7SUFDckIsT0FBTyxDQUFrQjtJQUN6QixjQUFjLEdBQVMsS0FBSyxDQUFDO0lBRTdCLG1CQUFtQixHQUFDLElBQUksR0FBQyxDQUFDLENBQUM7SUFDM0IsWUFBWSxHQUFDLEtBQUssQ0FBQztJQUNuQixJQUFJLEdBQWlCLElBQUksQ0FBQztJQUMxQixTQUFTLENBQUk7SUFFYixPQUFPLEdBQUMsRUFBRSxDQUFDO0lBQ1gsTUFBTSxDQUFDLGlCQUFpQixHQUFDLENBQUMsQ0FBQztJQUMzQixZQUFZLEdBQWdCLEVBQUUsQ0FBQTtJQUU5QixzQkFBc0IsR0FBRyxJQUFJLEdBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQztJQUNuQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsWUFBWSxHQUFHLElBQUksR0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDO0lBRXpCLG9CQUFvQixHQUFxQixJQUFJLENBQUM7SUFDOUMsd0JBQXdCLEdBQWEsSUFBSSxDQUFDO0lBQzFDLHdCQUF3QixHQUFRLENBQUMsQ0FBQztJQUVsQyxZQUFZLE9BQXdCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUMsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUdOLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBQztZQUNyQyxJQUFHO2dCQUNDLElBQUcsQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUM7b0JBQ3BELFlBQUUsQ0FBQyxTQUFTLENBQUMsSUFB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QUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBaGhCVCxvQ0FpaEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREJBZGFwdGVyT3B0aW9ucywgSURCRXJyb3IsIElEQlF1ZXJ5LCBJREJRdWVyeUZpZWxkLCBJREJSZXN1bHQgfSBmcm9tIFwiLi4vREJTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJREJBZGFwdGVyLCB9IGZyb20gXCIuL0lEQkFkYXB0ZXJcIjtcbmltcG9ydCBteXNxbCBmcm9tICdteXNxbDIvcHJvbWlzZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgbG9nSW5mbywgbG9nQ3JpdCwgbG9nRXJyb3IgfSBmcm9tIFwiLi4vTG9nU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRFcnJvcnMgZnJvbSBcIi4uL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW50ZXJmYWNlIElUcmFuc2FjdGlvbntcbiAgICBpZDpudW1iZXJcbiAgICB0aW1lc3RhbXA6bnVtYmVyLFxuICAgIGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb24sXG4gICAgcXVlcmllczp7c3FsOnN0cmluZyxzdGF0dXM6c3RyaW5nfVtdXG59XG5cblxuZXhwb3J0IGNsYXNzIE15c3FsQWRhcHRlciBpbXBsZW1lbnRzIElEQkFkYXB0ZXJ7XG4gICAgb3B0aW9uczpEQkFkYXB0ZXJPcHRpb25zO1xuICAgIHNlcnZpY2VTdGFydGVkOmJvb2xlYW49ZmFsc2U7XG5cbiAgICByZWNvbm5lY3Rpb25UaW1lb3V0PTEwMDAqMztcbiAgICByZWNvbm5lY3Rpbmc9ZmFsc2U7XG4gICAgcG9vbDpteXNxbC5Qb29sfG51bGw9bnVsbDtcbiAgICB0aW1lb3V0SUQ6YW55XG4gICAgICAgIFxuICAgIHF1ZXJpZXM9W107IC8vIFRPRE86IFNUT1JFIFFVRVJJRVMgU0VOVFMgQkVGT1JFIFRIRSBTRVJWSUNFIElTIFNUQVJURUQhXG4gICAgc3RhdGljIG5leHRUcmFuc2FjdGlvbklEPTE7XG4gICAgdHJhbnNhY3Rpb25zOklUcmFuc2FjdGlvbltdPVtdXG4gICAgXG4gICAgbWF4VHJhbnNhY3Rpb25XYWl0VGltZSA9IDEwMDAqNjAqMTsgLy8gMSBtaW4gYW5kIGRldGVsZXRlIHRyYW5zYWN0aW9uXG4gICAgbGFzdFN1Y2Nlc3NRdWVyeVRpbWUgPSAwO1xuICAgIHBpbmdJbnRlcnZhbCA9IDEwMDAqNjAqMjsgLy8gZWFjaCAyIG1pblxuICAgIFxuICAgIGZhaWxSZXBvcnRGaWxlU3RyZWFtOmZzLldyaXRlU3RyZWFtfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU6c3RyaW5nfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWU6bnVtYmVyPTA7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOkRCQWRhcHRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPW9wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgICAgICAvLyBDcmVhdGUgZmlsZSBmb3IgdHJhbnNhY3Rpb24gcG9yYmxlbSByZXBvcnRcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmModGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcikpXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKTtcbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyPXVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDYW4ndCBjcmVhdGUgdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgZGlyXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIHNldHVwIHByb2Nlc3MgZXhpdCBoYW5kbGVycyBpbnRlcnJ1cHQgKGN0cmwrYylcbiAgICAgICAgdGhpcy5zZXJ2aWNlU3RhcnRlZD1mYWxzZTtcbiAgICAgICAgbGV0IHBvb2xDcmVhdGVkOmJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgd2hpbGUoIXBvb2xDcmVhdGVkKXtcbiAgICAgICAgICAgIHBvb2xDcmVhdGVkID0gYXdhaXQgdGhpcy5yZWNyZWF0ZVBvb2woKTtcbiAgICAgICAgICAgIGlmKCFwb29sQ3JlYXRlZCl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY29ubmVjdCB0byBNWVNRTCEgUmV0cnlpbmcgaW4gMyBzZWNvbmRzLi4uXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpPT5zZXRUaW1lb3V0KHJlc29sdmUsMzAwMCkpIC8vIHNsZWVwIDMgc2Vjb25kc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXR1cFRpbWVycygpO1xuICAgIH1cblxuICAgIHNldHVwVGltZXJzKCl7XG5cbiAgICAgICAgLy8gSGFuZGxlIGhhbmdpbmcgdHJhbnNhY3Rpb25zXG4gICAgICAgIHNldEludGVydmFsKCgpPT57XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElEczpudW1iZXJbXT1bXTtcblxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIHRoaXMudHJhbnNhY3Rpb25zKXtcbiAgICAgICAgICAgICAgICBpZihub3ctaS50aW1lc3RhbXA+dGhpcy5tYXhUcmFuc2FjdGlvbldhaXRUaW1lKXtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoXCJSZWxlYXNlIHRyYW5zYWN0aW9uIGNvbm5lY3Rpb24gZHVlIHRvIHRpbWVvdXRcIilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKGksdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRJRHMucHVzaChpLmlkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9ucy5maWx0ZXIoaT0+IXJlbW92ZWRJRHMuaW5jbHVkZXMoaS5pZCkpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZyAmJiBjb3VudC10aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGg+MClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbW92ZWQ6IFwiLGNvdW50LXRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aClcblxuICAgICAgICAgICAgLy8gUElORyBTRVJWRVJcbiAgICAgICAgICAgIGlmKERhdGUubm93KCktdGhpcy5sYXN0U3VjY2Vzc1F1ZXJ5VGltZT50aGlzLnBpbmdJbnRlcnZhbCl7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMucG9vbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIERPIFBJTkdcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPTA7aTx0aGlzLm9wdGlvbnMuY29ubmVjdGlvbkxpbWl0O2krKyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoe3F1ZXJ5OlwiU0VMRUNUIDEgQE5PTElNSVRcIn0pXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGluZyBteXNxbCBvbiBlYWNoIGNvbm5lY3Rpb24gaW4gcG9vbFwiKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0sMTAwMCozMClcbiAgICAgICAgXG5cbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgICAgIGlmKCF0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGFmdGVyIDE1IG1pbiBvZiBpbmFjdGl2aXR5LCBjbG9zZSBmaWxlXG4gICAgICAgICAgICBpZihEYXRlLm5vdygpLXRoaXMuZmFpbFJlcG9ydExhc3RBY2Nlc3NUaW1lPjEwMDAqNjAqMTUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sMTAwMCo2MCo1KVxuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgY29ubmVjdGlvbiBwb29sICovXG4gICAgYXN5bmMgcmVjcmVhdGVQb29sKCk6UHJvbWlzZTxib29sZWFuPntcbiAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLFwiQ29ubmVjdGluZyB0byBteXNxbDogXFxuIFwiK0pTT04uc3RyaW5naWZ5KHsuLi50aGlzLm9wdGlvbnMscGFzc3dvcmQ6XCIqKioqXCJ9KSlcbiAgICBcbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRoaXMucG9vbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgIC8vIEtlZXAgYWxpdmUgcGFja2V0cyBzaG91bGQgYmUgc2VudFxuICAgICAgICAvKmVuYWJsZUtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdGhlbSBlYXJseVxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXk6IDMgKiAxMDAwLCAvLyAzIHNlY29uZHNcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBpZGxlIGNvbm5lY3Rpb25zLCBidXQgaXQncyBub3QgbWFuZGF0b3J5IGZvciB0aGUgZml4IHRvIHdvcmssIGl0IHNlZW1zXG4gICAgICAgIG1heElkbGU6IDAsXG4gICAgICAgIC8vIElkbGUgdGltZW91dCBtdWNoIGxhcmdlciB0aGFuIGtlZXAgYWxpdmUgZGVsYXkgYW5kIG11Y2ggc21hbGxlciB0aGFuIE15U1FMJ3MgdGltZW91dCBzZXR0aW5nXG4gICAgICAgIGlkbGVUaW1lb3V0OiA1ICogNjAgKiAxMDAwIC8vIDUgbWludXRlc1xuICAgICAgICAqL1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHRoaXMucG9vbCA9bXlzcWwuY3JlYXRlUG9vbCh7XG4gICAgICAgICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLmhvc3RcbiAgICAgICAgICAgICAgICAsdXNlcjogdGhpcy5vcHRpb25zLnVzZXJcbiAgICAgICAgICAgICAgICAscGFzc3dvcmQ6IHRoaXMub3B0aW9ucy5wYXNzd29yZFxuICAgICAgICAgICAgICAgICxkYXRhYmFzZTogdGhpcy5vcHRpb25zLmRhdGFiYXNlXG4gICAgICAgICAgICAgICAgLHBvcnQ6IHRoaXMub3B0aW9ucy5wb3J0XG4gICAgICAgICAgICAgICAgLGNvbm5lY3Rpb25MaW1pdDogdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25MaW1pdFxuICAgICAgICAgICAgICAgICxxdWV1ZUxpbWl0OiAxMFxuICAgICAgICAgICAgICAgICxtdWx0aXBsZVN0YXRlbWVudHM6IHRydWVcblxuICAgICAgICAgICAgICAgICxlbmFibGVLZWVwQWxpdmU6dHJ1ZVxuICAgICAgICAgICAgICAgICxrZWVwQWxpdmVJbml0aWFsRGVsYXk6MyoxMDAwXG4gICAgICAgICAgICAgICAgLy8sbWF4SWRsZTowXG4gICAgICAgICAgICAgICAgLGlkbGVUaW1lb3V0OjEwMDAqNjAqNVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhIFwiK2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdjb25uZWN0aW9uJywgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJNWVNRTCBDT05ORUNUSU9OIENSRUFURURcIilcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9vbD8ub24oJ2FjcXVpcmUnLCAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCIke015c3FsU2VydmljZS5qc31cIixcIk1ZU1FMIENPTk5FQ1RJT04gQUNRVUlSRURcIilcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbigncmVsZWFzZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiTVlTUUwgQ09OTkVDVElPTiBSRUxFQVNFRFwiKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdlbnF1ZXVlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCIke015c3FsU2VydmljZS5qc31cIixcIk1ZU1FMIENPTk5FQ1RJT04gRU5RVUVVRURcIilcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNvbm5lY3Rpb25cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDaGVjayBteXNxbCBjb25uZWN0aW9uXCIpXG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLF8pPT57XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMucG9vbD8uZ2V0Q29ubmVjdGlvbigpXG4gICAgICAgICAgICAgICAgaWYoY29ubil7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm4ucXVlcnkoXCJTRUxFQ1QgMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubj8ucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDb25uZWN0ZWQgdG8gTVlTUUwhXCIpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgICAgICB9ZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhXCIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcXVlcnkocmVxdWVzdDogSURCUXVlcnkpOiBQcm9taXNlPElEQlJlc3VsdD4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucHJlcGFyZVF1ZXJ5KHJlcXVlc3QpO1xuXG4gICAgICAgIC8vIENoZWNrIHBvb2xcbiAgICAgICAgaWYoIXRoaXMucG9vbCl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLFwiTm8gcG9vbFwiKVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJOT19QT09MXCIsXG4gICAgICAgICAgICAgICAgZXJybm86IDEwMDAwMCxcbiAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIG5hbWU6XCJOT19QT09MXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcIk15c3FsIHBvb2wgbm90IGNyZWF0ZWRcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vIGdldCBjb25uZWN0aW9uXG4gICAgICAgICAgICBsZXQgY29ubjpteXNxbC5Qb29sQ29ubmVjdGlvbnxudWxsPW51bGxcbiAgICAgICAgICAgIGlmKHJlcXVlc3QudHJhbnNhY3Rpb25JRCAmJiByZXF1ZXN0LnRyYW5zYWN0aW9uSUQ+MCl7XG4gICAgICAgICAgICAgICAgY29ubiA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbmQoaT0+aS5pZD09PXJlcXVlc3QudHJhbnNhY3Rpb25JRCk/LmNvbm4gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyeSBvbiB0cmFuc2FjdGlvbjogXCIsY29ubj8udGhyZWFkSWQpXG4gICAgICAgICAgICB9ZWxzZVxuICAgICAgICAgICAgICAgIGNvbm4gPSBhd2FpdCB0aGlzLnBvb2wuZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4ZWN1dGUgcXVlcnlcIixjb25uPy50aHJlYWRJZClcbiAgICAgICAgXG4gICAgICAgICAgICAvLyBpZiBjb25uZWN0aW9uIG5vdCBjcmVhdGVkXG4gICAgICAgICAgICBpZighY29ubil7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLGBObyBjb25uZWN0aW9uIGNyZWF0ZWQhYClcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJOT19DT05OXCIsXG4gICAgICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDEsXG4gICAgICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBuYW1lOlwiTk9fQ09OTlwiLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlwiTXlzcWwgcG9vbCBjYW50IGdldCBjb25uZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm4ucXVlcnkocXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6cmVzdWx0WzBdLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjpudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOnRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbEFkYXB0ZXIuanN9XCIsYEVycm9yIHdoZW4gZXhlY3V0aW5nIHF1ZXJ5OiAke2V9YClcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiRVhFQ19FUlJPUlwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDIsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICBuYW1lOlwiRVhFQ1VUSU9OX0VSUk9SXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTplK1wiXCIsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZVF1ZXJ5KHJlcXVlc3Q6IElEQlF1ZXJ5KTpzdHJpbmd7XG5cbiAgICAgICAgbGV0IHF1ZXJ5ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgbGV0IGZpZWxkcyA9IHJlcXVlc3QuZmllbGRzO1xuXG4gICAgICAgIGlmKGZpZWxkcyl7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXT17dmFsdWU6dmFsdWUsc3lzdGVtOmZhbHNlfVxuICAgICAgICAgICAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlPT09bnVsbClcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldPXt2YWx1ZTpudWxsLHN5c3RlbTp0cnVlfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZD0gTXlzcWxBZGFwdGVyLnByZXBhcmVRdWVyeUZpZWxkVmFsdWUodmFsdWUgYXMgSURCUXVlcnlGaWVsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB0b2RvIGNyZWF0ZSByZWdleCB0byByZXBsYWNlIGFsbFxuICAgICAgICAgICAgICAgIHF1ZXJ5PXF1ZXJ5LnJlcGxhY2VBbGwoXCJAXCIrbmFtZSxwYXJzZWQrXCJcIikgXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0bXAgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZih0bXAuaW5kZXhPZihcInNlbGVjdFwiKT09PTAgJiYgdG1wLmluZGV4T2YoXCJsaW1pdFwiKT09PS0xKVxuICAgICAgICAgICAgcXVlcnkrPVwiIExJTUlUIDEwMFwiXG4gICAgICAgICAgICBcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQE5PTElNSVRcIixcIlwiKVxuICAgIFxuICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQGZpZWxkc1wiKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0RmllbGROYW1lcz1bXVxuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRGaWVsZFZhbHVlcz1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluSW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmllbGROYW1lcy5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AnKVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRGaWVsZFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBxdWVyeT1xdWVyeVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnQGZpZWxkcycsaW5zZXJ0RmllbGROYW1lcy5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ0B2YWx1ZXMnLGluc2VydEZpZWxkVmFsdWVzLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBpbnNlcnRcIikhPT0tMSl7XG4gICAgICAgICAgICAgICAgbGV0IG9uaW5zZXJ0TmFtZXM9W11cbiAgICAgICAgICAgICAgICBsZXQgb25pbnNlcnRWYWx1ZXM9W11cbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGYgPSBmaWVsZHNbaV0gYXMgSURCUXVlcnlGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZi5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbmluc2VydE5hbWVzLnB1c2goKGYubmFtZStcIlwiKS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKVxuICAgICAgICAgICAgICAgICAgICBvbmluc2VydFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAaW5zZXJ0XCIsYCgke29uaW5zZXJ0TmFtZXMuam9pbihcIixcIil9KSBWQUxVRVMgKCR7b25pbnNlcnRWYWx1ZXMuam9pbihcIixcIil9KWApXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQG9udXBkYXRlXCIpIT09LTEpe1xuICAgICAgICAgICAgICAgIGxldCBvblVwZGF0ZT1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluVXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlLnB1c2goJ2AnKyhmLm5hbWUrXCJcIikucmVwbGFjZUFsbChcImBcIiwnJykucmVwbGFjZUFsbCgnXFxcIicsXCJcIikucmVwbGFjZUFsbCgnXFwnJyxcIlwiKSsnYCA9ICcrZi5fcGFyc2VkVmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZUFsbChcIkBvbnVwZGF0ZVwiLG9uVXBkYXRlLmpvaW4oXCIgLCBcIikpXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKCdAb25kdXBsaWNhdGUnKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgb25EdXBsaWNhdGU9W107XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmID0gZmllbGRzW2ldIGFzIElEQlF1ZXJ5RmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLnVzZUluUmVwbGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZS5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AgPSAnK2YuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAb25kdXBsaWNhdGVcIixvbkR1cGxpY2F0ZS5qb2luKFwiICwgXCIpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiAgcXVlcnk7XG4gICAgfVxuXG4gICAgLyoqIFByZXBhcmUgZmllbGQgdmFsdWUgKi9cbiAgICBzdGF0aWMgcHJlcGFyZVF1ZXJ5RmllbGRWYWx1ZShmaWVsZDpJREJRdWVyeUZpZWxkKTpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR7XG4gICAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICBsZXQgc3lzdGVtID0gZmllbGQuc3lzdGVtO1xuXG4gICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gXCJOVUxMXCJcblxuICAgICAgICBpZighc3lzdGVtICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnXCInLCdcXFxcXCInKTtcbiAgICAgICAgICAgIFxuICAgICAgICBmaWVsZC5fX3BhcnNlZFZhbHVlPXZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgIH1cblxuICAgIHByZXBhcmVDb3VudFF1ZXJ5KHF1ZXJ5OnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBsZXQgY291bnRRdWVyeSA9IHF1ZXJ5O1xuXG4gICAgICAgIC8vIFJFTU9WRSBMSU1JVFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJMSU1JVFwiKT09PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiTElNSVRcIikpO1xuICAgICAgICBcbiAgICAgICAgLy8gUkVNT1ZFIE9SREVSIFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJPUkRFUlwiKSE9PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiT1JERVJcIikpXG5cbiAgICAgICAgLy9UT0RPOiBSRU1PVkUgSk9JTlNcblxuICAgICAgICBjb3VudFF1ZXJ5ID0gY291bnRRdWVyeS5zdWJzdHJpbmcoY291bnRRdWVyeS5pbmRleE9mKFwiRlJPTVwiKSk7XG4gICAgICAgIFxuXG4gICAgICAgIGNvdW50UXVlcnkgPSBcIlNFTEVDVCBDT1VOVCgxKSBhcyBgY291bnRgIFwiK2NvdW50UXVlcnlcbiAgICAgICAgcmV0dXJuIGNvdW50UXVlcnk7XG4gICAgfVxuXG5cbiAgICAvLyBUUkFOU0FDVElPTlNcbiAgICBhc3luYyBjb21taXQodHJ4OklUcmFuc2FjdGlvbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgYXdhaXQgdHJ4LmNvbm4uY29tbWl0KCk7XG4gICAgICAgICAgICAvL2F3YWl0IHRyeC5jb25uLnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB0cnguY29ubi5yZWxlYXNlKCk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbih0cngpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgYXN5bmMgcm9sbGJhY2tUcmFuc2FjdGlvbih0cng6SVRyYW5zYWN0aW9uLGRvbk5vdFJlbW92ZT86Ym9vbGVhbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgbGV0IGVycj1udWxsO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIHN0YXJ0ZWRcIix0cnguY29ubi50aHJlYWRJZClcbiAgICAgICAgICAgIGF3YWl0IHRyeC5jb25uLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5jb21taXQoKTtcbiAgICAgICAgICAgIC8vYXdhaXQgdHJ4LmNvbm4ucXVlcnkoXCJST0xMQkFDS1wiKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgaWYoIWRvbk5vdFJlbW92ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbHRlcihpPT5pLmlkIT09dHJ4LmlkKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIGNvbXBsZXRlXCIsdHJ4LmNvbm4udGhyZWFkSWQpXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHJvbGxiYWNrIHRyYW5zYWN0aW9uXCIsdHJ4LnF1ZXJpZXMpXG4gICAgICAgICAgICBlcnIgPSB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RvcmVUcmFuc2FjdGlvbkFzUHJvYmxlbSh0cngsXCJyb2xsYmFja1wiKVxuXG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggc2VydmljZVxuICAgICAqL1xuICAgIGFzeW5jIGZpbmlzaCgpe1xuICAgICAgICBjb25zb2xlLmxvZyhcIkZpbmlzaGluZyBteXNxbCBzZXJ2aWNlXCIpXG4gICAgICAgIGZvcihsZXQgaSBvZiB0aGlzLnRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbihpKTtcblxuICAgICAgICBpZih0aGlzLnBvb2wpe1xuICAgICAgICAgICAgdHJ5e2F3YWl0IHRoaXMucG9vbC5lbmQoKTt9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY2xvc2UgTVlTUUwgcG9vbCFcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLmVuZCgpO1xuICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtPW51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlTXlzcWxRdWVyeUVycm9yKGVycjphbnksdGhyb3dhYmxlPzpib29sZWFuKTpJREJFcnJvcntcbiAgICAgICAgaWYoZXJyICYmICB0eXBlb2YgZXJyPT09XCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnIgJiYgXCJlcnJub1wiIGluIGVyciAmJiBcInNxbFwiIGluIGVyciAmJiBcIm5hbWVcIiBpbiBlcnIgJiYgXCJtZXNzYWdlXCIgaW4gZXJyKXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IGVyci5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBlcnJubzogZXJyLmVycm5vLFxuICAgICAgICAgICAgICAgICAgICBzcWw6IGVyci5zcWwsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGZhdGFsOmZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcIlFVRVJZX0VSUlwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDIsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBcIm5vIHF1ZXJ5XCIsXG4gICAgICAgICAgICAgICAgbmFtZTpcIlFVRVJZX0VSUlwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJFcnJvcjogXCIrKGVycik/ZXJyOlwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdG9yZVRyYW5zYWN0aW9uQXNQcm9ibGVtKHRyeDpJVHJhbnNhY3Rpb24sbWVzc2FnZTpzdHJpbmcpe1xuICAgIFxuICAgICAgICAgICAgaWYoIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQgJiYgIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHJlcG9ydCBmYWlsZWQgdHJhbnNhY3Rpb24sIG5vIHJlcG9ydCBmdW5jdGlvbjogdHJhbnNhY3Rpb25GYWlsUmVwb3J0IGluIG9wdGlvbnMsIGFuZCB0cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIgaXNudCBzZXRcIilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgICAgICBjb25zdCB5eXltbWRkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKS5yZXBsYWNlQWxsKFwiLVwiLFwiXCIpO1xuICAgIFxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIseXl5bW1kZCtcIi5qc29uXCIpO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pe1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSE9PWZpbGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW09bnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICBcbiAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU9ZmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0b3JlIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0OiBcIixmaWxlLHRyeC5xdWVyaWVzLG1lc3NhZ2UpXG4gICAgXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcbiAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KHtxdWVyaWVzOnRyeC5xdWVyaWVzLHRpbWU6dHJ4LnRpbWVzdGFtcCxkYXRlLG1lc3NhZ2V9KStcIlxcbn1FT0J7XFxuXCIsZXJyPT57XG4gICAgICAgICAgICAgICAgICAgIGlmKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHdyaXRlIHRvIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0IGZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiVHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgc3RvcmVkXCIpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgXG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0KVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQodHJ4LG1lc3NhZ2UpO1xuICAgICAgICB9XG59Il19
@@ -11,9 +11,10 @@ declare class DefaultErrors {
11
11
  static SERVICE_NOT_WORKING: IError;
12
12
  static TIMEOUT: IError;
13
13
  static METHOD_NOT_ALLOWED: IError;
14
+ static DB_ERROR: IError;
14
15
  }
15
16
  export declare class ErrorUtils {
16
- static isError(obj: any): boolean;
17
+ static isError(obj: any): obj is IError;
17
18
  static appendStack(error: IError, stack?: IError[]): IError;
18
19
  }
19
20
  export default DefaultErrors;
@@ -14,6 +14,7 @@ class DefaultErrors {
14
14
  static SERVICE_NOT_WORKING = { code: 8, message: "Service not working" };
15
15
  static TIMEOUT = { code: 9, message: "Timeout" };
16
16
  static METHOD_NOT_ALLOWED = { code: 10, message: "Method not allowed", httpStatus: 405 };
17
+ static DB_ERROR = { code: 11, message: "DB error" };
17
18
  }
18
19
  class ErrorUtils {
19
20
  static isError(obj) {
@@ -33,4 +34,4 @@ class ErrorUtils {
33
34
  }
34
35
  exports.ErrorUtils = ErrorUtils;
35
36
  exports.default = DefaultErrors;
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvc3RydWN0dXJlcy9EZWZhdWx0RXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRTtBQUdqRSxNQUFNLGFBQWE7SUFDZixNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtJQUM5RCxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtJQUNqRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUMvRCxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsWUFBWSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsY0FBYyxFQUFDLENBQUE7SUFDMUQsTUFBTSxDQUFDLFdBQVcsR0FBUSxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsR0FBRyxFQUFDLENBQUE7SUFDdkUsTUFBTSxDQUFDLG1CQUFtQixHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsQ0FBQTtJQUN4RSxNQUFNLENBQUMsT0FBTyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsU0FBUyxFQUFDLENBQUE7SUFDaEQsTUFBTSxDQUFDLGtCQUFrQixHQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsVUFBVSxFQUFDLEdBQUcsRUFBQyxDQUFBOztBQUcxRixNQUFhLFVBQVU7SUFFbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFPO1FBQ2xCLE1BQU0sY0FBYyxHQUFHLHFCQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxFQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXZFLElBQUcsQ0FBQyxjQUFjO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBQyxDQUFDLEtBQUcsNEJBQWdCLENBQUMsRUFBRTtZQUN0RSxPQUFPLEtBQUssQ0FBQztRQUVqQixJQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFDLENBQUMsS0FBRyw0QkFBZ0IsQ0FBQyxFQUFFO1lBQ3pFLE9BQU8sS0FBSyxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQVksRUFBQyxLQUFlO1FBQzNDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQXJCRCxnQ0FxQkM7QUFFRCxrQkFBZSxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0aW9uUmVwb3J0LCBWYWxpZGF0b3IgfSBmcm9tIFwiLi4vaGVscGVyL1ZhbGlkYXRvclwiXG5pbXBvcnQgeyBJRXJyb3IgfSBmcm9tIFwiLi9JbnRlcmZhY2VzXCJcblxuY2xhc3MgRGVmYXVsdEVycm9yc3tcbiAgICBzdGF0aWMgTk9UX0lNUExFTUVOVEVEOklFcnJvcj17Y29kZToxLG1lc3NhZ2U6XCJOb3QgaW1wbGVtZW50ZWRcIn1cbiAgICBzdGF0aWMgVU5LTk9XTl9SRVFVRVNUOklFcnJvcj17Y29kZToyLG1lc3NhZ2U6XCJVbmtub3duIHJlcXVlc3RcIn1cbiAgICBzdGF0aWMgSlNPTl9NQUxGT1JNRUQ6SUVycm9yPXtjb2RlOjMsbWVzc2FnZTpcIkpTT04gbWFsZm9ybWVkXCJ9XG4gICAgc3RhdGljIEZJTEVfVE9PX0xBUkdFOklFcnJvcj17Y29kZTo0LG1lc3NhZ2U6XCJGaWxlIGlzIHRvbyBsYXJnZVwifVxuICAgIHN0YXRpYyBDQU5UX1NFTkRfRklMRTpJRXJyb3I9e2NvZGU6NSxtZXNzYWdlOlwiQ2FuJ3Qgc2VuZCBmaWxlXCJ9XG4gICAgc3RhdGljIEZJTEVfTk9UX0VYSVNUUzpJRXJyb3I9e2NvZGU6NSxtZXNzYWdlOlwiRmlsZSBub3QgZXhpc3RzXCJ9XG4gICAgc3RhdGljIFVOQVVUSE9SSVpFRDpJRXJyb3I9e2NvZGU6NixtZXNzYWdlOlwiVW5hdXRob3JpemVkXCJ9XG4gICAgc3RhdGljIEJBRF9SRVFVRVNUOklFcnJvcj17Y29kZTo3LG1lc3NhZ2U6XCJCYWQgcmVxdWVzdFwiLGh0dHBTdGF0dXM6NDAwfVxuICAgIHN0YXRpYyBTRVJWSUNFX05PVF9XT1JLSU5HOklFcnJvcj17Y29kZTo4LG1lc3NhZ2U6XCJTZXJ2aWNlIG5vdCB3b3JraW5nXCJ9XG4gICAgc3RhdGljIFRJTUVPVVQ6SUVycm9yPXtjb2RlOjksbWVzc2FnZTpcIlRpbWVvdXRcIn1cbiAgICBzdGF0aWMgTUVUSE9EX05PVF9BTExPV0VEOklFcnJvcj17Y29kZToxMCxtZXNzYWdlOlwiTWV0aG9kIG5vdCBhbGxvd2VkXCIsaHR0cFN0YXR1czo0MDV9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvclV0aWxze1xuXG4gICAgc3RhdGljIGlzRXJyb3Iob2JqOmFueSk6Ym9vbGVhbntcbiAgICAgICAgY29uc3QgaXNGaWVsZHNFeGlzdHMgPSBWYWxpZGF0b3IudmFsaWRhdGVPYmplY3QoWydjb2RlJywnbWVzc2FnZSddLG9iailcbiAgICBcbiAgICAgICAgaWYoIWlzRmllbGRzRXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmouY29kZSx7dHlwZTpcIm51bWJlclwifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmoubWVzc2FnZSx7dHlwZTpcInN0cmluZ1wifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXBwZW5kU3RhY2soZXJyb3I6SUVycm9yLHN0YWNrPzpJRXJyb3JbXSk6SUVycm9ye1xuICAgICAgICBlcnJvci5zdGFjayA9IHN0YWNrO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0RXJyb3JzIl19
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvc3RydWN0dXJlcy9EZWZhdWx0RXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRTtBQUdqRSxNQUFNLGFBQWE7SUFDZixNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtJQUM5RCxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtJQUNqRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUMvRCxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsWUFBWSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsY0FBYyxFQUFDLENBQUE7SUFDMUQsTUFBTSxDQUFDLFdBQVcsR0FBUSxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsR0FBRyxFQUFDLENBQUE7SUFDdkUsTUFBTSxDQUFDLG1CQUFtQixHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsQ0FBQTtJQUN4RSxNQUFNLENBQUMsT0FBTyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsU0FBUyxFQUFDLENBQUE7SUFDaEQsTUFBTSxDQUFDLGtCQUFrQixHQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsVUFBVSxFQUFDLEdBQUcsRUFBQyxDQUFBO0lBQ3RGLE1BQU0sQ0FBQyxRQUFRLEdBQVEsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsQ0FBQTs7QUFHdkQsTUFBYSxVQUFVO0lBRW5CLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBTztRQUNsQixNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBQyxTQUFTLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQTtRQUV2RSxJQUFHLENBQUMsY0FBYztZQUNkLE9BQU8sS0FBSyxDQUFDO1FBRWpCLElBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLEVBQUMsQ0FBQyxLQUFHLDRCQUFnQixDQUFDLEVBQUU7WUFDdEUsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBQyxDQUFDLEtBQUcsNEJBQWdCLENBQUMsRUFBRTtZQUN6RSxPQUFPLEtBQUssQ0FBQztRQUVqQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFZLEVBQUMsS0FBZTtRQUMzQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUFyQkQsZ0NBcUJDO0FBRUQsa0JBQWUsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFsaWRhdGlvblJlcG9ydCwgVmFsaWRhdG9yIH0gZnJvbSBcIi4uL2hlbHBlci9WYWxpZGF0b3JcIlxuaW1wb3J0IHsgSUVycm9yIH0gZnJvbSBcIi4vSW50ZXJmYWNlc1wiXG5cbmNsYXNzIERlZmF1bHRFcnJvcnN7XG4gICAgc3RhdGljIE5PVF9JTVBMRU1FTlRFRDpJRXJyb3I9e2NvZGU6MSxtZXNzYWdlOlwiTm90IGltcGxlbWVudGVkXCJ9XG4gICAgc3RhdGljIFVOS05PV05fUkVRVUVTVDpJRXJyb3I9e2NvZGU6MixtZXNzYWdlOlwiVW5rbm93biByZXF1ZXN0XCJ9XG4gICAgc3RhdGljIEpTT05fTUFMRk9STUVEOklFcnJvcj17Y29kZTozLG1lc3NhZ2U6XCJKU09OIG1hbGZvcm1lZFwifVxuICAgIHN0YXRpYyBGSUxFX1RPT19MQVJHRTpJRXJyb3I9e2NvZGU6NCxtZXNzYWdlOlwiRmlsZSBpcyB0b28gbGFyZ2VcIn1cbiAgICBzdGF0aWMgQ0FOVF9TRU5EX0ZJTEU6SUVycm9yPXtjb2RlOjUsbWVzc2FnZTpcIkNhbid0IHNlbmQgZmlsZVwifVxuICAgIHN0YXRpYyBGSUxFX05PVF9FWElTVFM6SUVycm9yPXtjb2RlOjUsbWVzc2FnZTpcIkZpbGUgbm90IGV4aXN0c1wifVxuICAgIHN0YXRpYyBVTkFVVEhPUklaRUQ6SUVycm9yPXtjb2RlOjYsbWVzc2FnZTpcIlVuYXV0aG9yaXplZFwifVxuICAgIHN0YXRpYyBCQURfUkVRVUVTVDpJRXJyb3I9e2NvZGU6NyxtZXNzYWdlOlwiQmFkIHJlcXVlc3RcIixodHRwU3RhdHVzOjQwMH1cbiAgICBzdGF0aWMgU0VSVklDRV9OT1RfV09SS0lORzpJRXJyb3I9e2NvZGU6OCxtZXNzYWdlOlwiU2VydmljZSBub3Qgd29ya2luZ1wifVxuICAgIHN0YXRpYyBUSU1FT1VUOklFcnJvcj17Y29kZTo5LG1lc3NhZ2U6XCJUaW1lb3V0XCJ9XG4gICAgc3RhdGljIE1FVEhPRF9OT1RfQUxMT1dFRDpJRXJyb3I9e2NvZGU6MTAsbWVzc2FnZTpcIk1ldGhvZCBub3QgYWxsb3dlZFwiLGh0dHBTdGF0dXM6NDA1fVxuICAgIHN0YXRpYyBEQl9FUlJPUjpJRXJyb3I9e2NvZGU6MTEsbWVzc2FnZTpcIkRCIGVycm9yXCJ9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvclV0aWxze1xuXG4gICAgc3RhdGljIGlzRXJyb3Iob2JqOmFueSk6b2JqIGlzIElFcnJvcntcbiAgICAgICAgY29uc3QgaXNGaWVsZHNFeGlzdHMgPSBWYWxpZGF0b3IudmFsaWRhdGVPYmplY3QoWydjb2RlJywnbWVzc2FnZSddLG9iailcbiAgICBcbiAgICAgICAgaWYoIWlzRmllbGRzRXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmouY29kZSx7dHlwZTpcIm51bWJlclwifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmoubWVzc2FnZSx7dHlwZTpcInN0cmluZ1wifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXBwZW5kU3RhY2soZXJyb3I6SUVycm9yLHN0YWNrPzpJRXJyb3JbXSk6SUVycm9ye1xuICAgICAgICBlcnJvci5zdGFjayA9IHN0YWNrO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0RXJyb3JzIl19
package/dist/index.d.ts CHANGED
@@ -8,4 +8,5 @@ import { S_MONITOR_REGISTRATE_ACTION } from "./apiServer/monitor/Monitor";
8
8
  import { DataProvider } from "./apiServer/helper/DataProvider";
9
9
  import { UID } from "./apiServer/helper/UID";
10
10
  import { ExternalService } from "./apiServer/external/ExternalService";
11
- export { UID, APIService, Initializer, LocalRequest, MysqlService, Validator, LogService, DataProvider, ErrorUtils, ExternalService, S_MONITOR_REGISTRATE_ACTION };
11
+ import { DBService } from "./apiServer/DBService";
12
+ export { UID, APIService, Initializer, LocalRequest, MysqlService, Validator, LogService, DataProvider, ErrorUtils, ExternalService, DBService, S_MONITOR_REGISTRATE_ACTION };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.S_MONITOR_REGISTRATE_ACTION = exports.ExternalService = exports.ErrorUtils = exports.DataProvider = exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = exports.UID = void 0;
3
+ exports.S_MONITOR_REGISTRATE_ACTION = exports.DBService = exports.ExternalService = exports.ErrorUtils = exports.DataProvider = exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = exports.UID = void 0;
4
4
  const APIService_1 = require("./apiServer/APIService");
5
5
  Object.defineProperty(exports, "APIService", { enumerable: true, get: function () { return APIService_1.APIService; } });
6
6
  Object.defineProperty(exports, "Initializer", { enumerable: true, get: function () { return APIService_1.Initializer; } });
@@ -22,4 +22,6 @@ const UID_1 = require("./apiServer/helper/UID");
22
22
  Object.defineProperty(exports, "UID", { enumerable: true, get: function () { return UID_1.UID; } });
23
23
  const ExternalService_1 = require("./apiServer/external/ExternalService");
24
24
  Object.defineProperty(exports, "ExternalService", { enumerable: true, get: function () { return ExternalService_1.ExternalService; } });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWdFO0FBYzVELDJGQWRLLHVCQUFVLE9BY0w7QUFDViw0RkFmZ0Isd0JBQVcsT0FlaEI7QUFkZiwyREFBd0Q7QUFlcEQsNkZBZkssMkJBQVksT0FlTDtBQWRoQiwyREFBcUQ7QUFlakQsNkZBZkksMkJBQVksT0FlSjtBQWRoQiw0REFBeUQ7QUFlckQsMEZBZksscUJBQVMsT0FlTDtBQWRiLHVEQUFvRDtBQWVoRCwyRkFmSyx1QkFBVSxPQWVMO0FBZGQsd0VBQWtFO0FBZ0I5RCwyRkFoQkssMEJBQVUsT0FnQkw7QUFmZCx5REFBMEU7QUFpQnRFLDRHQWpCSyxxQ0FBMkIsT0FpQkw7QUFoQi9CLGtFQUErRDtBQWEzRCw2RkFiSywyQkFBWSxPQWFMO0FBWmhCLGdEQUE2QztBQUt6QyxvRkFMSyxTQUFHLE9BS0w7QUFKUCwwRUFBdUU7QUFhbkUsZ0dBYkssaUNBQWUsT0FhTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSVNlcnZpY2UsSW5pdGlhbGl6ZXIgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvQVBJU2VydmljZVwiO1xuaW1wb3J0IHsgTG9jYWxSZXF1ZXN0IH0gZnJvbSBcIi4vYXBpU2VydmVyL0xvY2FsUmVxdWVzdFwiO1xuaW1wb3J0IHtNeXNxbFNlcnZpY2V9IGZyb20gXCIuL2FwaVNlcnZlci9NeXNxbFNlcnZpY2VcIlxuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vYXBpU2VydmVyL2hlbHBlci9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvTG9nU2VydmljZVwiO1xuaW1wb3J0IHsgRXJyb3JVdGlscyB9IGZyb20gXCIuL2FwaVNlcnZlci9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnNcIjtcbmltcG9ydCB7IFNfTU9OSVRPUl9SRUdJU1RSQVRFX0FDVElPTiB9IGZyb20gXCIuL2FwaVNlcnZlci9tb25pdG9yL01vbml0b3JcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2FwaVNlcnZlci9oZWxwZXIvRGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBVSUQgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvaGVscGVyL1VJRFwiO1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlIH0gZnJvbSBcIi4vYXBpU2VydmVyL2V4dGVybmFsL0V4dGVybmFsU2VydmljZVwiO1xuXG5cbmV4cG9ydCB7XG4gICAgVUlELFxuICAgIEFQSVNlcnZpY2UsXG4gICAgSW5pdGlhbGl6ZXIsXG4gICAgTG9jYWxSZXF1ZXN0LFxuICAgIE15c3FsU2VydmljZSxcbiAgICBWYWxpZGF0b3IsXG4gICAgTG9nU2VydmljZSxcbiAgICBEYXRhUHJvdmlkZXIsXG4gICAgRXJyb3JVdGlscyxcbiAgICBFeHRlcm5hbFNlcnZpY2UsXG4gICAgU19NT05JVE9SX1JFR0lTVFJBVEVfQUNUSU9OXG59Il19
25
+ const DBService_1 = require("./apiServer/DBService");
26
+ Object.defineProperty(exports, "DBService", { enumerable: true, get: function () { return DBService_1.DBService; } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWdFO0FBZTVELDJGQWZLLHVCQUFVLE9BZUw7QUFDViw0RkFoQmdCLHdCQUFXLE9BZ0JoQjtBQWZmLDJEQUF3RDtBQWdCcEQsNkZBaEJLLDJCQUFZLE9BZ0JMO0FBZmhCLDJEQUFxRDtBQWdCakQsNkZBaEJJLDJCQUFZLE9BZ0JKO0FBZmhCLDREQUF5RDtBQWdCckQsMEZBaEJLLHFCQUFTLE9BZ0JMO0FBZmIsdURBQW9EO0FBZ0JoRCwyRkFoQkssdUJBQVUsT0FnQkw7QUFmZCx3RUFBa0U7QUFpQjlELDJGQWpCSywwQkFBVSxPQWlCTDtBQWhCZCx5REFBMEU7QUFtQnRFLDRHQW5CSyxxQ0FBMkIsT0FtQkw7QUFsQi9CLGtFQUErRDtBQWMzRCw2RkFkSywyQkFBWSxPQWNMO0FBYmhCLGdEQUE2QztBQU16QyxvRkFOSyxTQUFHLE9BTUw7QUFMUCwwRUFBdUU7QUFjbkUsZ0dBZEssaUNBQWUsT0FjTDtBQWJuQixxREFBa0Q7QUFjOUMsMEZBZEsscUJBQVMsT0FjTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSVNlcnZpY2UsSW5pdGlhbGl6ZXIgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvQVBJU2VydmljZVwiO1xuaW1wb3J0IHsgTG9jYWxSZXF1ZXN0IH0gZnJvbSBcIi4vYXBpU2VydmVyL0xvY2FsUmVxdWVzdFwiO1xuaW1wb3J0IHtNeXNxbFNlcnZpY2V9IGZyb20gXCIuL2FwaVNlcnZlci9NeXNxbFNlcnZpY2VcIlxuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vYXBpU2VydmVyL2hlbHBlci9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvTG9nU2VydmljZVwiO1xuaW1wb3J0IHsgRXJyb3JVdGlscyB9IGZyb20gXCIuL2FwaVNlcnZlci9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnNcIjtcbmltcG9ydCB7IFNfTU9OSVRPUl9SRUdJU1RSQVRFX0FDVElPTiB9IGZyb20gXCIuL2FwaVNlcnZlci9tb25pdG9yL01vbml0b3JcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2FwaVNlcnZlci9oZWxwZXIvRGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBVSUQgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvaGVscGVyL1VJRFwiO1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlIH0gZnJvbSBcIi4vYXBpU2VydmVyL2V4dGVybmFsL0V4dGVybmFsU2VydmljZVwiO1xuaW1wb3J0IHsgREJTZXJ2aWNlIH0gZnJvbSBcIi4vYXBpU2VydmVyL0RCU2VydmljZVwiO1xuXG5cbmV4cG9ydCB7XG4gICAgVUlELFxuICAgIEFQSVNlcnZpY2UsXG4gICAgSW5pdGlhbGl6ZXIsXG4gICAgTG9jYWxSZXF1ZXN0LFxuICAgIE15c3FsU2VydmljZSxcbiAgICBWYWxpZGF0b3IsXG4gICAgTG9nU2VydmljZSxcbiAgICBEYXRhUHJvdmlkZXIsXG4gICAgRXJyb3JVdGlscyxcbiAgICBFeHRlcm5hbFNlcnZpY2UsXG4gICAgREJTZXJ2aWNlLFxuICAgIFNfTU9OSVRPUl9SRUdJU1RSQVRFX0FDVElPTlxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badmfck-api-server",
3
- "version": "2.7.3",
3
+ "version": "2.7.5",
4
4
  "description": "Simple API http server based on express",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",