taxtank-core 0.21.11 → 0.21.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundles/taxtank-core.umd.js +85 -40
  2. package/bundles/taxtank-core.umd.js.map +1 -1
  3. package/esm2015/lib/collections/property/property.collection.js +2 -8
  4. package/esm2015/lib/forms/bank/bank-account/bank-account-allocation.form.js +1 -1
  5. package/esm2015/lib/forms/bank/bank-account/bank-account-properties.form.js +4 -3
  6. package/esm2015/lib/forms/report/my-tax/my-tax-deductions.form.js +2 -2
  7. package/esm2015/lib/models/property/property.js +5 -1
  8. package/esm2015/lib/models/report/my-tax/my-tax-deductions/deduction-fields.const.js +2 -3
  9. package/esm2015/lib/models/report/my-tax/my-tax-deductions/my-tax-deductions.js +3 -3
  10. package/esm2015/lib/models/report/my-tax/my-tax-rent/my-tax-rent.js +8 -10
  11. package/esm2015/lib/services/http/transaction/transaction.service.js +5 -3
  12. package/esm2015/lib/services/http/tutorial-video/tutorial-video-response.interface.js +2 -0
  13. package/esm2015/lib/services/http/tutorial-video/tutorial-video.service.js +29 -0
  14. package/esm2015/lib/services/http/tutorial-video/video-source.interface.js +5 -0
  15. package/esm2015/lib/services/property/property-calculation/property-calculation.service.js +31 -8
  16. package/esm2015/public-api.js +3 -1
  17. package/fesm2015/taxtank-core.js +83 -33
  18. package/fesm2015/taxtank-core.js.map +1 -1
  19. package/lib/collections/property/property.collection.d.ts +0 -2
  20. package/lib/models/property/property.d.ts +1 -0
  21. package/lib/services/http/tutorial-video/tutorial-video-response.interface.d.ts +4 -0
  22. package/lib/services/http/tutorial-video/tutorial-video.service.d.ts +14 -0
  23. package/lib/services/http/tutorial-video/video-source.interface.d.ts +8 -0
  24. package/lib/services/property/property-calculation/property-calculation.service.d.ts +8 -0
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
@@ -124,7 +124,8 @@ export class TransactionService extends RestService {
124
124
  transactions.forEach((transaction, index) => {
125
125
  // @TODO backend: need to upload file in the same backend endpoint with transaction add/update
126
126
  // check if passed receipt and upload file
127
- if (transaction.file) {
127
+ // @TODO Alex: refactor. Move receipt to separated service and use event dispatcher to handle it
128
+ if (transaction.file && (transaction.file instanceof File)) {
128
129
  transaction.id = response[index].id;
129
130
  addedTransactions[index].file = transaction.file;
130
131
  this.uploadReceipt(addedTransactions[index]);
@@ -161,7 +162,8 @@ export class TransactionService extends RestService {
161
162
  const updatedTransaction = plainToClass(Transaction, response);
162
163
  // @TODO need to upload file in the same backend endpoint with transaction add/update
163
164
  // check if passed new receipt and upload file
164
- if (transaction.file) {
165
+ // @TODO Alex: refactor. Move receipt to separated service and use event dispatcher to handle it
166
+ if (transaction.file && (transaction.file instanceof File)) {
165
167
  updatedTransaction.file = transaction.file;
166
168
  this.uploadReceipt(updatedTransaction);
167
169
  }
@@ -320,4 +322,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
320
322
  providedIn: 'root'
321
323
  }]
322
324
  }] });
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVyRixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0RBQStELENBQUM7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LFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM3RyxDQUFDOztnSEFoV1Usa0JBQWtCO29IQUFsQixrQkFBa0IsY0FGakIsTUFBTTs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbkJhc2UgfSBmcm9tICcuLi8uLi8uLi9kYi9Nb2RlbHMvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcmVwbGFjZSwgc29ydCB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9hcnJheSc7XG5pbXBvcnQgeyBlbnVtVG9MaXN0IH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zL2VudW0tdG8tbGlzdCc7XG5pbXBvcnQgeyBDaGFydEFjY291bnRzSGVhZGluZ1RheGFibGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZGIvRW51bXMvY2hhcnQtYWNjb3VudHMtaGVhZGluZy10YXhhYmxlLmVudW0nO1xuaW1wb3J0IHsgQ2hhcnRBY2NvdW50c0hlYWRpbmdUYXhEZWR1Y3RpYmxlRW51bSB9IGZyb20gJy4uLy4uLy4uL2RiL0VudW1zL2NoYXJ0LWFjY291bnRzLWhlYWRpbmctdGF4LWRlZHVjdGlibGUuZW51bSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbkVudW0gfSBmcm9tICcuLi8uLi8uLi9kYi9FbnVtcy90cmFuc2FjdGlvbi1vcGVyYXRpb24uZW51bSc7XG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uL3Jlc3QvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IHBsYWluVG9DbGFzcyB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IENIQVJUX0FDQ09VTlRTX0NBVEVHT1JJRVMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2hhcnQtYWNjb3VudHMvY2hhcnQtYWNjb3VudHMtY2F0ZWdvcmllcy5jb25zdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBBcHBFdmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2V2ZW50L2FwcC1ldmVudC10eXBlLmVudW0nO1xuaW1wb3J0IHsgQXBwRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnQvYXBwLWV2ZW50JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUmVjZWlwdCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbi1yZWNlaXB0JztcbmltcG9ydCB7IENoYXJ0QWNjb3VudHMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2hhcnQtYWNjb3VudHMvY2hhcnQtYWNjb3VudHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENoYXJ0QWNjb3VudHNUYXhMYWJlbHNFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NoYXJ0LWFjY291bnRzL2NoYXJ0LWFjY291bnRzLXRheC1sYWJlbHMuZW51bSc7XG5pbXBvcnQgeyBNZXNzYWdlc0VudW0gfSBmcm9tICcuL21lc3NhZ2VzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlDYXRlZ29yeUxpc3RFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZGIvRW51bXMvcHJvcGVydHkvcHJvcGVydHktY2F0ZWdvcnktbGlzdC5lbnVtJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciB0cmFuc2FjdGlvbnMgYnVzaW5lc3MgbG9naWNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25TZXJ2aWNlIGV4dGVuZHMgUmVzdFNlcnZpY2U8VHJhbnNhY3Rpb25CYXNlLCBUcmFuc2FjdGlvbj4ge1xuICAvLyB1cmwgcGFydCBmb3IgVHJhbnNhY3Rpb24gQVBJXG4gIHVybDogc3RyaW5nID0gJ3RyYW5zYWN0aW9ucyc7XG4gIG1vZGVsQ2xhc3MgPSBUcmFuc2FjdGlvbjtcbiAgdHJhbnNhY3Rpb25EZWxldGVkOiBFdmVudEVtaXR0ZXI8VHJhbnNhY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxUcmFuc2FjdGlvbj4oKTtcblxuICAvKipcbiAgICogTGlzdGVuIGV2ZW50cyBmcm9tIEV2ZW50IERpc3BhdGNoZXIgc2VydmljZXNcbiAgICovXG4gIGxpc3RlbkV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbkRlcHJlY2lhdGlvbkNoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuUHJvcGVydHlTaGFyZVVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBsaXN0IG9mIGFsbCB1c2VyJ3MgVGF4VGFuayB0cmFuc2FjdGlvbnNcbiAgICovXG4gIGdldCgpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICBpZiAoIXRoaXMuY2FjaGUpIHtcbiAgICAgIC8vIHNldCBjYWNoZSBhcyBkZWZhdWx0IGVtcHR5IGFycmF5IHRvIGF2b2lkIG11bHRpcGxlIGJhY2tlbmQgcmVxdWVzdHNcbiAgICAgIHRoaXMuY2FjaGUgPSBbXTtcbiAgICAgIHRoaXMuZmV0Y2goKVxuICAgICAgICAuc3Vic2NyaWJlKCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gdHJhbnNhY3Rpb25zO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAvLyBhc3NpZ24gY2hpbGQgdHJhbnNhY3Rpb25zIChmZWVzKSB0byBwYXJlbnQgdHJhbnNhY3Rpb25zXG4gICAgICBtYXAoKHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10gPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCA9PiB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBjaGlsZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHQ6IFRyYW5zYWN0aW9uKTogYm9vbGVhbiA9PiB0LnBhcmVudFRyYW5zYWN0aW9uICYmIHQucGFyZW50VHJhbnNhY3Rpb24uaWQgPT09IHRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnQodHJhbnNhY3Rpb25zLCAnZGF0ZScsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc2luZ2xlIG5ldyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gbW9kZWwgTmV3IFRyYW5zYWN0aW9uIGluc3RhbmNlIGZvciBzYXZpbmdcbiAgICovXG4gIGFkZChtb2RlbDogVHJhbnNhY3Rpb24pOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uPiB7XG4gICAgLy8gd2UgZG9uJ3QgaGF2ZSBQT1NUIEFQSSBlbmRwb2ludCBmb3Igc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuYWRkQmF0Y2goW21vZGVsXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG5ld1RyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uID0+IHtcbiAgICAgICAgICAvLyBAVE9ETyBhbGV4XG4gICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLmRpc3BhdGNoKFxuICAgICAgICAgICAgbmV3IEFwcEV2ZW50PFRyYW5zYWN0aW9uPihBcHBFdmVudFR5cGVFbnVtLlRSQU5TQUNUSU9OX0NSRUFURUQsIG5ld1RyYW5zYWN0aW9uc1swXSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIG5ld1RyYW5zYWN0aW9uc1swXTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRyYW5zYWN0aW9ucyByZWxhdGVkIHdpdGggcHJvcGVydHlcbiAgICovXG4gIGdldEJ5UHJvcGVydHlJZChwcm9wZXJ0eUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucy5maWx0ZXIoKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uLnByb3BlcnR5Py5pZCA9PT0gcHJvcGVydHlJZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgdHJhbnNhY3Rpb25zIHdpdGggdGFuayB0eXBlICdXb3JrJ1xuICAgKi9cbiAgZ2V0V29ya1RyYW5zYWN0aW9ucygpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucy5maWx0ZXIoKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IGJvb2xlYW4gPT4gdHJhbnNhY3Rpb24uaXNXb3JrVGFuaygpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgcHJvcGVydHkgaG9sZGluZyBjb3N0cyAodHJhbnNhY3Rpb25zIHJlbGF0ZWQgdG8gdmFjYW50IGxhbmQgcHJvcGVydHkpXG4gICAqL1xuICBnZXRQcm9wZXJ0eUhvbGRpbmdDb3N0cyhwcm9wZXJ0eUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChcbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9LyR7dGhpcy51cmx9P3Byb3BlcnR5SWQ9JHtwcm9wZXJ0eUlkfSZwcm9wZXJ0eUNhdGVnb3J5SWQ9JHtQcm9wZXJ0eUNhdGVnb3J5TGlzdEVudW0uVkFDQU5UX0xBTkR9YFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHRyYW5zYWN0aW9uc0Jhc2U6IFRyYW5zYWN0aW9uQmFzZVtdKTogVHJhbnNhY3Rpb25bXSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uc0Jhc2UubWFwKCh0cmFuc2FjdGlvbkJhc2U6IFRyYW5zYWN0aW9uQmFzZSk6IFRyYW5zYWN0aW9uID0+IHBsYWluVG9DbGFzcyhUcmFuc2FjdGlvbiwgdHJhbnNhY3Rpb25CYXNlKSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBsaXN0IG9mIHRheGFibGUgdHJhbnNhY3Rpb25zIHdpdGggdGFuayB0eXBlICdXb3JrJ1xuICAgKi9cbiAgZ2V0VGF4YWJsZVdvcmtUcmFuc2FjdGlvbnMoKTogT2JzZXJ2YWJsZTxUcmFuc2FjdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V29ya1RyYW5zYWN0aW9ucygpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zLmZpbHRlcigodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogYm9vbGVhbiA9PiAhIXRyYW5zYWN0aW9uLmNoYXJ0QWNjb3VudHMudGF4UmV0dXJuSXRlbSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBtdWx0aXBsZSB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9ucyBMaXN0IG9mIG5ldyBUcmFuc2FjdGlvbiBpbnN0YW5jZXMgZm9yIHNhdmluZ1xuICAgKi9cbiAgYWRkQmF0Y2godHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogT2JzZXJ2YWJsZTxUcmFuc2FjdGlvbltdPiB7XG4gICAgdHJhbnNhY3Rpb25zID0gXy5jbG9uZURlZXAodHJhbnNhY3Rpb25zKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH1gLCB0cmFuc2FjdGlvbnMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogVHJhbnNhY3Rpb25CYXNlW10pID0+IHtcbiAgICAgICAgICBjb25zdCBhZGRlZFRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSA9IHJlc3BvbnNlLm1hcCgoaXRlbTogVHJhbnNhY3Rpb25CYXNlKSA9PiBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIGl0ZW0pKTtcblxuICAgICAgICAgIHRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEBUT0RPIGJhY2tlbmQ6IG5lZWQgdG8gdXBsb2FkIGZpbGUgaW4gdGhlIHNhbWUgYmFja2VuZCBlbmRwb2ludCB3aXRoIHRyYW5zYWN0aW9uIGFkZC91cGRhdGVcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHBhc3NlZCByZWNlaXB0IGFuZCB1cGxvYWQgZmlsZVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZpbGUpIHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uaWQgPSByZXNwb25zZVtpbmRleF0uaWQ7XG4gICAgICAgICAgICAgIGFkZGVkVHJhbnNhY3Rpb25zW2luZGV4XS5maWxlID0gdHJhbnNhY3Rpb24uZmlsZTtcbiAgICAgICAgICAgICAgdGhpcy51cGxvYWRSZWNlaXB0KGFkZGVkVHJhbnNhY3Rpb25zW2luZGV4XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEBUT0RPIFZpa3RvcjogaW1wbGVtZW50IEFQSSBmb3Igc2F2aW5nIG9mIG5lc3RlZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIC8vIGFkZCBjaGlsZCB0cmFuc2FjdGlvbnMgaWYgZXhpc3RcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5mb3JFYWNoKChjaGlsZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNoaWxkVHJhbnNhY3Rpb24ucGFyZW50VHJhbnNhY3Rpb24gPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIHtpZDogYWRkZWRUcmFuc2FjdGlvbnNbaW5kZXhdLmlkfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFkZEJhdGNoKHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucykuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byBjYWNoZVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLm9wZXJhdGlvbiA9PT0gVHJhbnNhY3Rpb25PcGVyYXRpb25FbnVtLlRSQU5TRkVSKSB7XG4gICAgICAgICAgICAgIGFkZGVkVHJhbnNhY3Rpb25zLnB1c2goYWRkZWRUcmFuc2FjdGlvbnNbMF0udHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUucHVzaCguLi5hZGRlZFRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLmRpc3BhdGNoKFxuICAgICAgICAgICAgbmV3IEFwcEV2ZW50PFRyYW5zYWN0aW9uW10+KEFwcEV2ZW50VHlwZUVudW0uVFJBTlNBQ1RJT05TX0NSRUFURUQsIGFkZGVkVHJhbnNhY3Rpb25zKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKE1lc3NhZ2VzRW51bS5DUkVBVEVEX01FU1NBR0UpO1xuXG4gICAgICAgICAgcmV0dXJuIGFkZGVkVHJhbnNhY3Rpb25zO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgZXhpc3RpbmcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIGluc3RhbmNlIGZvciB1cGRhdGluZ1xuICAgKi9cbiAgdXBkYXRlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IE9ic2VydmFibGU8VHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfS8ke3RyYW5zYWN0aW9uLmlkfWAsIHRyYW5zYWN0aW9uKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IFRyYW5zYWN0aW9uQmFzZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vIEBUT0RPIG5lZWQgdG8gdXBsb2FkIGZpbGUgaW4gdGhlIHNhbWUgYmFja2VuZCBlbmRwb2ludCB3aXRoIHRyYW5zYWN0aW9uIGFkZC91cGRhdGVcbiAgICAgICAgICAvLyBjaGVjayBpZiBwYXNzZWQgbmV3IHJlY2VpcHQgYW5kIHVwbG9hZCBmaWxlXG4gICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZpbGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRUcmFuc2FjdGlvbi5maWxlID0gdHJhbnNhY3Rpb24uZmlsZTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkUmVjZWlwdCh1cGRhdGVkVHJhbnNhY3Rpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEBUT0RPIFZpa3RvcjogaW1wbGVtZW50IEFQSSBmb3Igc2F2aW5nIG9mIG5lc3RlZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICBpZiAodHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gYWRkIHBhcmVudCB0cmFuc2FjdGlvbiB0byBjaGlsZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5mb3JFYWNoKChjaGlsZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjaGlsZFRyYW5zYWN0aW9uLnBhcmVudFRyYW5zYWN0aW9uID0gcGxhaW5Ub0NsYXNzKFRyYW5zYWN0aW9uLCB7aWQ6IHVwZGF0ZWRUcmFuc2FjdGlvbi5pZH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBjaGlsZCB0cmFuc2FjdGlvbnMgYnkgaWQgZXhpc3RpbmcgdG8gZGVmaW5lIGFkZCBvciB1cGRhdGUgYWN0aW9uLlxuICAgICAgICAgICAgY29uc3QgY2hpbGRUcmFuc2FjdGlvbnNUb1VwZGF0ZTogVHJhbnNhY3Rpb25bXSA9IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5maWx0ZXIoKHQ6IFRyYW5zYWN0aW9uKSA9PiB0LmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkVHJhbnNhY3Rpb25zVG9BZGQ6IFRyYW5zYWN0aW9uW10gPSB0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMuZmlsdGVyKCh0OiBUcmFuc2FjdGlvbikgPT4gIXQuaWQpO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgY2hpbGQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICBpZiAoY2hpbGRUcmFuc2FjdGlvbnNUb1VwZGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYXRjaChjaGlsZFRyYW5zYWN0aW9uc1RvVXBkYXRlKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIGNoaWxkIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgaWYgKGNoaWxkVHJhbnNhY3Rpb25zVG9BZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQmF0Y2goY2hpbGRUcmFuc2FjdGlvbnNUb0FkZCkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc3VjY2VzcyhNZXNzYWdlc0VudW0uVVBEQVRFRF9NRVNTQUdFKTtcblxuICAgICAgICAgIHJlcGxhY2UodGhpcy5jYWNoZSwgdXBkYXRlZFRyYW5zYWN0aW9uKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRUcmFuc2FjdGlvbjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIG11bHRpcGxlIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIGZvciB1cGRhdGluZ1xuICAgKi9cbiAgdXBkYXRlQmF0Y2godHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogT2JzZXJ2YWJsZTxUcmFuc2FjdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH1gLCB0cmFuc2FjdGlvbnMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogVHJhbnNhY3Rpb25CYXNlW10pID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdID0gcmVzcG9uc2UubWFwKChpdGVtOiBUcmFuc2FjdGlvbkJhc2UpID0+IHBsYWluVG9DbGFzcyhUcmFuc2FjdGlvbiwgaXRlbSkpO1xuXG4gICAgICAgICAgdXBkYXRlZFRyYW5zYWN0aW9ucy5mb3JFYWNoKCh1cGRhdGVkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIHVwZGF0ZWRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRUcmFuc2FjdGlvbnM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlbGV0ZSB0cmFuc2FjdGlvbiBhbmQgcmVsYXRlZCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqL1xuICBkZWxldGUobW9kZWw6IFRyYW5zYWN0aW9uKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH0vJHttb2RlbC5pZH1gKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuZmlsdGVyKCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIC8vIHdoZW4gZGVsZXRlIHRyYW5zZmVyIHdlIGRlbGV0ZSBhY3R1YWxseSAyIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgaWYgKG1vZGVsLmlzVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFttb2RlbC5pZF07XG5cbiAgICAgICAgICAgICAgLy8gZ2V0IGlkIG9mIHJlbGF0ZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgaWYgKG1vZGVsLnRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgLy8ganVzdCB0YWtlIGlkIGlmIHdlIGRlbGV0ZSBzb3VyY2UgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICBpZHMucHVzaChtb2RlbC50cmFuc2Zlci5pZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBzb3VyY2UgdHJhbnNhY3Rpb24gaWQgaWYgd2UgZGVsZXRlIGRlc3RpbmF0aW9uIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICAgICAgaWRzLnB1c2godGhpcy5jYWNoZS5maW5kKCh0OiBUcmFuc2FjdGlvbik6IGJvb2xlYW4gPT4gdC50cmFuc2Zlci5pZCA9PT0gbW9kZWwuaWQpLmlkKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiAhaWRzLmluY2x1ZGVzKHRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uLmlkICE9PSBtb2RlbC5pZCAmJiB0cmFuc2FjdGlvbi5wYXJlbnRUcmFuc2FjdGlvbj8uaWQgIT09IG1vZGVsLmlkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLmRpc3BhdGNoKFxuICAgICAgICAgICAgbmV3IEFwcEV2ZW50PFRyYW5zYWN0aW9uPihBcHBFdmVudFR5cGVFbnVtLlRSQU5TQUNUSU9OX0RFTEVURUQsIG1vZGVsKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKE1lc3NhZ2VzRW51bS5ERUxFVEVEX01FU1NBR0UpO1xuXG4gICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZWxldGVkLmVtaXQobW9kZWwpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1cGxvYWQgdHJhbnNhY3Rpb24gcmVjZWlwdCBpbWFnZVxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24g0JVoZSB0cmFuc2FjdGlvbiBmb3Igd2hpY2ggdGhlIHJlY2VpcHQgd2lsbCBiZSBpbXBvcnRlZFxuICAgKi9cbiAgdXBsb2FkUmVjZWlwdCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCB0cmFuc2FjdGlvbi5maWxlKTtcbiAgICB0cmFuc2FjdGlvbi5yZWNlaXB0ID0gbnVsbDtcblxuICAgIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9LyR7dGhpcy51cmx9LyR7dHJhbnNhY3Rpb24uaWR9L3JlY2VpcHRzYCwgZm9ybURhdGEpXG4gICAgICAuc3Vic2NyaWJlKChyZWNlaXB0UmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgZmlsZSBhZnRlciBzYXZlXG4gICAgICAgIHRyYW5zYWN0aW9uLmZpbGUgPSBudWxsO1xuICAgICAgICB0cmFuc2FjdGlvbi5yZWNlaXB0ID0gcGxhaW5Ub0NsYXNzKFRyYW5zYWN0aW9uUmVjZWlwdCwgcmVjZWlwdFJlc3BvbnNlKTtcbiAgICAgICAgcmVwbGFjZSh0aGlzLmNhY2hlLCB0cmFuc2FjdGlvbik7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSBncm9zcyBpbmNvbWUgYW1vdW50IGJhc2VkIG9uIHRyYW5zYWN0aW9uIGFtb3VudCBhbmQgdGF4ZXMgKGZlZXMpXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUcmFuc2FjdGlvbiBpbnN0YW5jZSBmb3IgY2FsY3VsYXRpb25cbiAgICovXG4gIGNhbGN1bGF0ZUdyb3NzQW1vdW50KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IG51bWJlciB7XG4gICAgbGV0IGFtb3VudDogbnVtYmVyID0gdHJhbnNhY3Rpb24uYW1vdW50IHx8IDA7XG5cbiAgICAvLyBncm9zcyBpbmNvbWUgYW1vdW50IGluY2x1ZGVzIGFtb3VudCBvZiBmZWVzIGZvciBwcm9wZXJ0eSB0YW5rIGFuZCB0YXggZm9yIHdvcmsgdGFua1xuICAgIGlmICh0cmFuc2FjdGlvbi5pc1Byb3BlcnR5VGFuaygpKSB7XG4gICAgICBhbW91bnQgKz0gdHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zLnJlZHVjZSgoc3VtOiBudW1iZXIsIGl0ZW06IFRyYW5zYWN0aW9uKSA9PiBzdW0gKyBpdGVtLmFtb3VudCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEBUT0RPIEFsZXg6IGZpeCBsb2dpYyBhZnRlciBUVC02NDEgcmVhZHlcbiAgICAgIGFtb3VudCArPSAodHJhbnNhY3Rpb24udGF4IHx8IDApO1xuICAgIH1cblxuICAgIHJldHVybiBhbW91bnQ7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGxhYmVsIGZvciB0cmFuc2FjdGlvbiB0YXggZmllbGQgZGVwZW5kZWQgb2Ygc2VsZWN0ZWQgY2hhcnQgYWNjb3VudC5cbiAgICogdGF4IHR5cGUgZGVwZW5kcyBvZiBjaGFydCBhY2NvdW50IGhlYWRpbmcgb3IgY2F0ZWdvcnkuXG4gICAqL1xuICBnZXRUYXhMYWJlbChjaGFydEFjY291bnRzOiBDaGFydEFjY291bnRzKTogQ2hhcnRBY2NvdW50c1RheExhYmVsc0VudW0ge1xuICAgIC8vIGdldCBzaW1wbGUgYXJyYXkgb2YgaWRzIGZyb20gZW51bSB3aXRoIHRheGFibGUgY2hhcnQgYWNjb3VudHMgaGVhZGluZ3NcbiAgICBjb25zdCB0YXhhYmxlQ0FIZWFkaW5nc0lkczogbnVtYmVyW10gPSBlbnVtVG9MaXN0KENoYXJ0QWNjb3VudHNIZWFkaW5nVGF4YWJsZUVudW0pXG4gICAgICAubWFwKChpdGVtOiB7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfSkgPT4gaXRlbS52YWx1ZSk7XG4gICAgLy8gZ2V0IHNpbXBsZSBhcnJheSBvZiBpZHMgZnJvbSBlbnVtIHdpdGggdGF4IGRlZHVjdGlibGUgY2hhcnQgYWNjb3VudHMgaGVhZGluZ3NcbiAgICBjb25zdCBkZWR1Y3RpYmxlQ0FIZWFkaW5nc0lkczogbnVtYmVyW10gPSBlbnVtVG9MaXN0KENoYXJ0QWNjb3VudHNIZWFkaW5nVGF4RGVkdWN0aWJsZUVudW0pXG4gICAgICAubWFwKChpdGVtOiB7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfSkgPT4gaXRlbS52YWx1ZSk7XG5cbiAgICAvLyBjaGVjayBpZiBvbmUgb2YgaWRzIGFycmF5cyBpbmNsdWRlcyBjdXJyZW50IGNoYXJ0IGFjY291bnRzIGhlYWRpbmcgaWQgYW5kIHNldCB0YXggbGFiZWxcbiAgICAvLyBvdGhlcndpc2UgbGFiZWwgaXMgZW1wdHkgZm9yIHRoaXMgY2xhc3NcbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgdGF4YWJsZUNBSGVhZGluZ3NJZHMuaW5jbHVkZXMoY2hhcnRBY2NvdW50cy5oZWFkaW5nPy5pZCk6XG4gICAgICAgIHJldHVybiBDaGFydEFjY291bnRzVGF4TGFiZWxzRW51bS5UQVhfUEFJRDtcbiAgICAgIGNhc2UgZGVkdWN0aWJsZUNBSGVhZGluZ3NJZHMuaW5jbHVkZXMoY2hhcnRBY2NvdW50cy5oZWFkaW5nPy5pZCk6XG4gICAgICAgIHJldHVybiBDaGFydEFjY291bnRzVGF4TGFiZWxzRW51bS5UQVhfREVEVUNURUQ7XG4gICAgICBjYXNlIENIQVJUX0FDQ09VTlRTX0NBVEVHT1JJRVMud29ya0luY29tZS5pbmNsdWRlcyhjaGFydEFjY291bnRzLmNhdGVnb3J5KTpcbiAgICAgICAgcmV0dXJuIENoYXJ0QWNjb3VudHNUYXhMYWJlbHNFbnVtLlRBWF9XSVRISEVMRDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRXZlbnREaXNwYXRjaGVyU2VydmljZSBldmVudCByZWxhdGVkIHRvIERlcHJlY2lhdGlvbiBjaGFuZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5EZXByZWNpYXRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLm9uKEFwcEV2ZW50VHlwZUVudW0uREVQUkVDSUFUSU9OX0RFTEVURUQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoKClcbiAgICAgICAgLnN1YnNjcmliZSgodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IHRyYW5zYWN0aW9ucztcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBFdmVudERpc3BhdGNoZXJTZXJ2aWNlIGV2ZW50IHJlbGF0ZWQgdG8gUHJvcGVydHkgU2hhcmUgY2hhbmdpbmdcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuUHJvcGVydHlTaGFyZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2Uub24oQXBwRXZlbnRUeXBlRW51bS5QUk9QRVJUWV9TSEFSRV9VUERBVEVEKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNldENhY2hlKCkpO1xuICB9XG59XG4iXX0=
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVyRixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDM0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDOztBQUVsRzs7R0FFRztBQUlILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxXQUF5QztJQUhqRjs7UUFJRSwrQkFBK0I7UUFDL0IsUUFBRyxHQUFXLGNBQWMsQ0FBQztRQUM3QixlQUFVLEdBQUcsV0FBVyxDQUFDO1FBQ3pCLHVCQUFrQixHQUE4QixJQUFJLFlBQVksRUFBZSxDQUFDO0tBK1ZqRjtJQTdWQzs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixzRUFBc0U7WUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssRUFBRTtpQkFDVCxTQUFTLENBQUMsQ0FBQyxZQUEyQixFQUFFLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO2dCQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJO1FBQzFDLDBEQUEwRDtRQUMxRCxHQUFHLENBQUMsQ0FBQyxZQUEyQixFQUFpQixFQUFFO1lBQ2pELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUF3QixFQUFRLEVBQUU7Z0JBQ3RELFdBQVcsQ0FBQyxZQUFZLEdBQUcsWUFBWTtvQkFDckMsaUNBQWlDO3FCQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFjLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLEtBQWtCO1FBQ3BCLHlEQUF5RDtRQUN6RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsZUFBOEIsRUFBZSxFQUFFO1lBQ2xELGFBQWE7WUFDYixJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUNsQyxJQUFJLFFBQVEsQ0FBYyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEYsQ0FBQztZQUVGLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ2QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFlBQTJCLEVBQWlCLEVBQUU7WUFDakQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBd0IsRUFBVyxFQUFFOztnQkFDL0QsT0FBTyxDQUFBLE1BQUEsV0FBVyxDQUFDLFFBQVEsMENBQUUsRUFBRSxNQUFLLFVBQVUsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ2QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFlBQTJCLEVBQWlCLEVBQUU7WUFDakQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBd0IsRUFBVyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILHVCQUF1QixDQUFDLFVBQWtCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsZUFBZSxVQUFVLHVCQUF1Qix3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FDNUg7YUFDRSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsZ0JBQW1DLEVBQWlCLEVBQUU7WUFDekQsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFnQyxFQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDN0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRTthQUM5QixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsWUFBMkIsRUFBaUIsRUFBRTtZQUNqRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUF3QixFQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxZQUEyQjtRQUNsQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksQ0FBQzthQUN6RSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBMkIsRUFBRSxFQUFFO1lBQ2xDLE1BQU0saUJBQWlCLEdBQWtCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFxQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFbEgsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQXdCLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQy9ELDhGQUE4RjtnQkFDOUYsMENBQTBDO2dCQUMxQyxnR0FBZ0c7Z0JBQ2hHLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7b0JBQzFELFdBQVcsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDOUM7Z0JBRUQsZ0VBQWdFO2dCQUNoRSxrQ0FBa0M7Z0JBQ2xDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7b0JBQ25DLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQTZCLEVBQUUsRUFBRTt3QkFDakUsZ0JBQWdCLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO29CQUNwRyxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDckQ7Z0JBRUQsb0NBQW9DO2dCQUNwQyxJQUFJLFdBQVcsQ0FBQyxTQUFTLEtBQUssd0JBQXdCLENBQUMsUUFBUSxFQUFFO29CQUMvRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3ZEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEI7WUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUNsQyxJQUFJLFFBQVEsQ0FBZ0IsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FDdEYsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV4RCxPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUM7YUFDekYsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQXlCLEVBQUUsRUFBRTtZQUNoQyxNQUFNLGtCQUFrQixHQUFnQixZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRTVFLHFGQUFxRjtZQUNyRiw4Q0FBOEM7WUFDOUMsZ0dBQWdHO1lBQ2hHLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7Z0JBQzFELGtCQUFrQixDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDeEM7WUFFRCxnRUFBZ0U7WUFDaEUsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDbkMsK0NBQStDO2dCQUMvQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUE2QixFQUFFLEVBQUU7b0JBQ2pFLGdCQUFnQixDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztnQkFDOUYsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsNkVBQTZFO2dCQUM3RSxNQUFNLHlCQUF5QixHQUFrQixXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRyxNQUFNLHNCQUFzQixHQUFrQixXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXpHLDRCQUE0QjtnQkFDNUIsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDekQ7Z0JBRUQseUJBQXlCO2dCQUN6QixJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRTtvQkFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUNuRDthQUNGO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXhELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLE9BQU8sa0JBQWtCLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsWUFBMkI7UUFDckMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLENBQUM7YUFDeEUsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQTJCLEVBQUUsRUFBRTtZQUNsQyxNQUFNLG1CQUFtQixHQUFrQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXBILG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUErQixFQUFFLEVBQUU7Z0JBQzlELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxtQkFBbUIsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDekUsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBd0IsRUFBVyxFQUFFOztnQkFDbkUseURBQXlEO2dCQUN6RCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7b0JBQ3BCLE1BQU0sR0FBRyxHQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUVqQyx5Q0FBeUM7b0JBQ3pDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTt3QkFDbEIsK0NBQStDO3dCQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzdCO3lCQUFNO3dCQUNMLGtFQUFrRTt3QkFDbEUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWMsRUFBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUN2RjtvQkFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3RDO2dCQUVELE9BQU8sV0FBVyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUEsTUFBQSxXQUFXLENBQUMsaUJBQWlCLDBDQUFFLEVBQUUsTUFBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FDbEMsSUFBSSxRQUFRLENBQWMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQ3ZFLENBQUM7WUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFeEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsV0FBd0I7UUFDcEMsTUFBTSxRQUFRLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUM7YUFDekYsU0FBUyxDQUFDLENBQUMsZUFBb0IsRUFBRSxFQUFFO1lBQ2xDLHdDQUF3QztZQUN4QyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4QixXQUFXLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN4RSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsV0FBd0I7UUFDM0MsSUFBSSxNQUFNLEdBQVcsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFFN0Msc0ZBQXNGO1FBQ3RGLElBQUksV0FBVyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUFpQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyRzthQUFNO1lBQ0wsMkNBQTJDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDbEM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLGFBQTRCOztRQUN0Qyx5RUFBeUU7UUFDekUsTUFBTSxvQkFBb0IsR0FBYSxVQUFVLENBQUMsK0JBQStCLENBQUM7YUFDL0UsR0FBRyxDQUFDLENBQUMsSUFBc0MsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELGdGQUFnRjtRQUNoRixNQUFNLHVCQUF1QixHQUFhLFVBQVUsQ0FBQyxxQ0FBcUMsQ0FBQzthQUN4RixHQUFHLENBQUMsQ0FBQyxJQUFzQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0QsMEZBQTBGO1FBQzFGLDBDQUEwQztRQUMxQyxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQUEsYUFBYSxDQUFDLE9BQU8sMENBQUUsRUFBRSxDQUFDO2dCQUMzRCxPQUFPLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztZQUM3QyxLQUFLLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxNQUFBLGFBQWEsQ0FBQyxPQUFPLDBDQUFFLEVBQUUsQ0FBQztnQkFDOUQsT0FBTywwQkFBMEIsQ0FBQyxZQUFZLENBQUM7WUFDakQsS0FBSyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hFLE9BQU8sMEJBQTBCLENBQUMsWUFBWSxDQUFDO1lBQ2pEO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDbkYsSUFBSSxDQUFDLEtBQUssRUFBRTtpQkFDVCxTQUFTLENBQUMsQ0FBQyxZQUEyQixFQUFFLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO2dCQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7O2dIQWxXVSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uQmFzZSB9IGZyb20gJy4uLy4uLy4uL2RiL01vZGVscy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyByZXBsYWNlLCBzb3J0IH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zL2FycmF5JztcbmltcG9ydCB7IGVudW1Ub0xpc3QgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvZW51bS10by1saXN0JztcbmltcG9ydCB7IENoYXJ0QWNjb3VudHNIZWFkaW5nVGF4YWJsZUVudW0gfSBmcm9tICcuLi8uLi8uLi9kYi9FbnVtcy9jaGFydC1hY2NvdW50cy1oZWFkaW5nLXRheGFibGUuZW51bSc7XG5pbXBvcnQgeyBDaGFydEFjY291bnRzSGVhZGluZ1RheERlZHVjdGlibGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZGIvRW51bXMvY2hhcnQtYWNjb3VudHMtaGVhZGluZy10YXgtZGVkdWN0aWJsZS5lbnVtJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uT3BlcmF0aW9uRW51bSB9IGZyb20gJy4uLy4uLy4uL2RiL0VudW1zL3RyYW5zYWN0aW9uLW9wZXJhdGlvbi5lbnVtJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzdC9yZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgQ0hBUlRfQUNDT1VOVFNfQ0FURUdPUklFUyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jaGFydC1hY2NvdW50cy9jaGFydC1hY2NvdW50cy1jYXRlZ29yaWVzLmNvbnN0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEFwcEV2ZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnQvYXBwLWV2ZW50LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBBcHBFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9ldmVudC9hcHAtZXZlbnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25SZWNlaXB0IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLXJlY2VpcHQnO1xuaW1wb3J0IHsgQ2hhcnRBY2NvdW50cyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jaGFydC1hY2NvdW50cy9jaGFydC1hY2NvdW50cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ2hhcnRBY2NvdW50c1RheExhYmVsc0VudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2hhcnQtYWNjb3VudHMvY2hhcnQtYWNjb3VudHMtdGF4LWxhYmVscy5lbnVtJztcbmltcG9ydCB7IE1lc3NhZ2VzRW51bSB9IGZyb20gJy4vbWVzc2FnZXMuZW51bSc7XG5pbXBvcnQgeyBQcm9wZXJ0eUNhdGVnb3J5TGlzdEVudW0gfSBmcm9tICcuLi8uLi8uLi9kYi9FbnVtcy9wcm9wZXJ0eS9wcm9wZXJ0eS1jYXRlZ29yeS1saXN0LmVudW0nO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIHRyYW5zYWN0aW9ucyBidXNpbmVzcyBsb2dpY1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblNlcnZpY2UgZXh0ZW5kcyBSZXN0U2VydmljZTxUcmFuc2FjdGlvbkJhc2UsIFRyYW5zYWN0aW9uPiB7XG4gIC8vIHVybCBwYXJ0IGZvciBUcmFuc2FjdGlvbiBBUElcbiAgdXJsOiBzdHJpbmcgPSAndHJhbnNhY3Rpb25zJztcbiAgbW9kZWxDbGFzcyA9IFRyYW5zYWN0aW9uO1xuICB0cmFuc2FjdGlvbkRlbGV0ZWQ6IEV2ZW50RW1pdHRlcjxUcmFuc2FjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRyYW5zYWN0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZXZlbnRzIGZyb20gRXZlbnQgRGlzcGF0Y2hlciBzZXJ2aWNlc1xuICAgKi9cbiAgbGlzdGVuRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuRGVwcmVjaWF0aW9uQ2hhbmdlKCk7XG4gICAgdGhpcy5saXN0ZW5Qcm9wZXJ0eVNoYXJlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgYWxsIHVzZXIncyBUYXhUYW5rIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgZ2V0KCk6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25bXT4ge1xuICAgIGlmICghdGhpcy5jYWNoZSkge1xuICAgICAgLy8gc2V0IGNhY2hlIGFzIGRlZmF1bHQgZW1wdHkgYXJyYXkgdG8gYXZvaWQgbXVsdGlwbGUgYmFja2VuZCByZXF1ZXN0c1xuICAgICAgdGhpcy5jYWNoZSA9IFtdO1xuICAgICAgdGhpcy5mZXRjaCgpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSB0cmFuc2FjdGlvbnM7XG4gICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIC8vIGFzc2lnbiBjaGlsZCB0cmFuc2FjdGlvbnMgKGZlZXMpIHRvIHBhcmVudCB0cmFuc2FjdGlvbnNcbiAgICAgIG1hcCgodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSA9PiB7XG4gICAgICAgIHRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGNoaWxkIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigodDogVHJhbnNhY3Rpb24pOiBib29sZWFuID0+IHQucGFyZW50VHJhbnNhY3Rpb24gJiYgdC5wYXJlbnRUcmFuc2FjdGlvbi5pZCA9PT0gdHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydCh0cmFuc2FjdGlvbnMsICdkYXRlJywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzaW5nbGUgbmV3IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBtb2RlbCBOZXcgVHJhbnNhY3Rpb24gaW5zdGFuY2UgZm9yIHNhdmluZ1xuICAgKi9cbiAgYWRkKG1vZGVsOiBUcmFuc2FjdGlvbik6IE9ic2VydmFibGU8VHJhbnNhY3Rpb24+IHtcbiAgICAvLyB3ZSBkb24ndCBoYXZlIFBPU1QgQVBJIGVuZHBvaW50IGZvciBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gdGhpcy5hZGRCYXRjaChbbW9kZWxdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgobmV3VHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgICAgIC8vIEBUT0RPIGFsZXhcbiAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2UuZGlzcGF0Y2goXG4gICAgICAgICAgICBuZXcgQXBwRXZlbnQ8VHJhbnNhY3Rpb24+KEFwcEV2ZW50VHlwZUVudW0uVFJBTlNBQ1RJT05fQ1JFQVRFRCwgbmV3VHJhbnNhY3Rpb25zWzBdKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3VHJhbnNhY3Rpb25zWzBdO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdHJhbnNhY3Rpb25zIHJlbGF0ZWQgd2l0aCBwcm9wZXJ0eVxuICAgKi9cbiAgZ2V0QnlQcm9wZXJ0eUlkKHByb3BlcnR5SWQ6IG51bWJlcik6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLmdldCgpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zLmZpbHRlcigodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb24ucHJvcGVydHk/LmlkID09PSBwcm9wZXJ0eUlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgbGlzdCBvZiB0cmFuc2FjdGlvbnMgd2l0aCB0YW5rIHR5cGUgJ1dvcmsnXG4gICAqL1xuICBnZXRXb3JrVHJhbnNhY3Rpb25zKCk6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLmdldCgpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zLmZpbHRlcigodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogYm9vbGVhbiA9PiB0cmFuc2FjdGlvbi5pc1dvcmtUYW5rKCkpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBwcm9wZXJ0eSBob2xkaW5nIGNvc3RzICh0cmFuc2FjdGlvbnMgcmVsYXRlZCB0byB2YWNhbnQgbGFuZCBwcm9wZXJ0eSlcbiAgICovXG4gIGdldFByb3BlcnR5SG9sZGluZ0Nvc3RzKHByb3BlcnR5SWQ6IG51bWJlcik6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KFxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH0/cHJvcGVydHlJZD0ke3Byb3BlcnR5SWR9JnByb3BlcnR5Q2F0ZWdvcnlJZD0ke1Byb3BlcnR5Q2F0ZWdvcnlMaXN0RW51bS5WQUNBTlRfTEFORH1gXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgodHJhbnNhY3Rpb25zQmFzZTogVHJhbnNhY3Rpb25CYXNlW10pOiBUcmFuc2FjdGlvbltdID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zQmFzZS5tYXAoKHRyYW5zYWN0aW9uQmFzZTogVHJhbnNhY3Rpb25CYXNlKTogVHJhbnNhY3Rpb24gPT4gcGxhaW5Ub0NsYXNzKFRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbkJhc2UpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgdGF4YWJsZSB0cmFuc2FjdGlvbnMgd2l0aCB0YW5rIHR5cGUgJ1dvcmsnXG4gICAqL1xuICBnZXRUYXhhYmxlV29ya1RyYW5zYWN0aW9ucygpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXb3JrVHJhbnNhY3Rpb25zKClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10gPT4ge1xuICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbnMuZmlsdGVyKCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBib29sZWFuID0+ICEhdHJhbnNhY3Rpb24uY2hhcnRBY2NvdW50cy50YXhSZXR1cm5JdGVtKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIG11bHRpcGxlIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIExpc3Qgb2YgbmV3IFRyYW5zYWN0aW9uIGluc3RhbmNlcyBmb3Igc2F2aW5nXG4gICAqL1xuICBhZGRCYXRjaCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICB0cmFuc2FjdGlvbnMgPSBfLmNsb25lRGVlcCh0cmFuc2FjdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfWAsIHRyYW5zYWN0aW9ucylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkJhc2VbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkVHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdID0gcmVzcG9uc2UubWFwKChpdGVtOiBUcmFuc2FjdGlvbkJhc2UpID0+IHBsYWluVG9DbGFzcyhUcmFuc2FjdGlvbiwgaXRlbSkpO1xuXG4gICAgICAgICAgdHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgLy8gQFRPRE8gYmFja2VuZDogbmVlZCB0byB1cGxvYWQgZmlsZSBpbiB0aGUgc2FtZSBiYWNrZW5kIGVuZHBvaW50IHdpdGggdHJhbnNhY3Rpb24gYWRkL3VwZGF0ZVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcGFzc2VkIHJlY2VpcHQgYW5kIHVwbG9hZCBmaWxlXG4gICAgICAgICAgICAvLyBAVE9ETyBBbGV4OiByZWZhY3Rvci4gTW92ZSByZWNlaXB0IHRvIHNlcGFyYXRlZCBzZXJ2aWNlIGFuZCB1c2UgZXZlbnQgZGlzcGF0Y2hlciB0byBoYW5kbGUgaXRcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5maWxlICYmICh0cmFuc2FjdGlvbi5maWxlIGluc3RhbmNlb2YgRmlsZSkpIHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uaWQgPSByZXNwb25zZVtpbmRleF0uaWQ7XG4gICAgICAgICAgICAgIGFkZGVkVHJhbnNhY3Rpb25zW2luZGV4XS5maWxlID0gdHJhbnNhY3Rpb24uZmlsZTtcbiAgICAgICAgICAgICAgdGhpcy51cGxvYWRSZWNlaXB0KGFkZGVkVHJhbnNhY3Rpb25zW2luZGV4XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEBUT0RPIFZpa3RvcjogaW1wbGVtZW50IEFQSSBmb3Igc2F2aW5nIG9mIG5lc3RlZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIC8vIGFkZCBjaGlsZCB0cmFuc2FjdGlvbnMgaWYgZXhpc3RcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5mb3JFYWNoKChjaGlsZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNoaWxkVHJhbnNhY3Rpb24ucGFyZW50VHJhbnNhY3Rpb24gPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIHtpZDogYWRkZWRUcmFuc2FjdGlvbnNbaW5kZXhdLmlkfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFkZEJhdGNoKHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucykuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byBjYWNoZVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLm9wZXJhdGlvbiA9PT0gVHJhbnNhY3Rpb25PcGVyYXRpb25FbnVtLlRSQU5TRkVSKSB7XG4gICAgICAgICAgICAgIGFkZGVkVHJhbnNhY3Rpb25zLnB1c2goYWRkZWRUcmFuc2FjdGlvbnNbMF0udHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUucHVzaCguLi5hZGRlZFRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLmRpc3BhdGNoKFxuICAgICAgICAgICAgbmV3IEFwcEV2ZW50PFRyYW5zYWN0aW9uW10+KEFwcEV2ZW50VHlwZUVudW0uVFJBTlNBQ1RJT05TX0NSRUFURUQsIGFkZGVkVHJhbnNhY3Rpb25zKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKE1lc3NhZ2VzRW51bS5DUkVBVEVEX01FU1NBR0UpO1xuXG4gICAgICAgICAgcmV0dXJuIGFkZGVkVHJhbnNhY3Rpb25zO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgZXhpc3RpbmcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIGluc3RhbmNlIGZvciB1cGRhdGluZ1xuICAgKi9cbiAgdXBkYXRlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IE9ic2VydmFibGU8VHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfS8ke3RyYW5zYWN0aW9uLmlkfWAsIHRyYW5zYWN0aW9uKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IFRyYW5zYWN0aW9uQmFzZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vIEBUT0RPIG5lZWQgdG8gdXBsb2FkIGZpbGUgaW4gdGhlIHNhbWUgYmFja2VuZCBlbmRwb2ludCB3aXRoIHRyYW5zYWN0aW9uIGFkZC91cGRhdGVcbiAgICAgICAgICAvLyBjaGVjayBpZiBwYXNzZWQgbmV3IHJlY2VpcHQgYW5kIHVwbG9hZCBmaWxlXG4gICAgICAgICAgLy8gQFRPRE8gQWxleDogcmVmYWN0b3IuIE1vdmUgcmVjZWlwdCB0byBzZXBhcmF0ZWQgc2VydmljZSBhbmQgdXNlIGV2ZW50IGRpc3BhdGNoZXIgdG8gaGFuZGxlIGl0XG4gICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZpbGUgJiYgKHRyYW5zYWN0aW9uLmZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgICAgICAgdXBkYXRlZFRyYW5zYWN0aW9uLmZpbGUgPSB0cmFuc2FjdGlvbi5maWxlO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRSZWNlaXB0KHVwZGF0ZWRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQFRPRE8gVmlrdG9yOiBpbXBsZW1lbnQgQVBJIGZvciBzYXZpbmcgb2YgbmVzdGVkIHRyYW5zYWN0aW9uc1xuICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBhZGQgcGFyZW50IHRyYW5zYWN0aW9uIHRvIGNoaWxkIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zLmZvckVhY2goKGNoaWxkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGNoaWxkVHJhbnNhY3Rpb24ucGFyZW50VHJhbnNhY3Rpb24gPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb24sIHtpZDogdXBkYXRlZFRyYW5zYWN0aW9uLmlkfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNoaWxkIHRyYW5zYWN0aW9ucyBieSBpZCBleGlzdGluZyB0byBkZWZpbmUgYWRkIG9yIHVwZGF0ZSBhY3Rpb24uXG4gICAgICAgICAgICBjb25zdCBjaGlsZFRyYW5zYWN0aW9uc1RvVXBkYXRlOiBUcmFuc2FjdGlvbltdID0gdHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zLmZpbHRlcigodDogVHJhbnNhY3Rpb24pID0+IHQuaWQpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRUcmFuc2FjdGlvbnNUb0FkZDogVHJhbnNhY3Rpb25bXSA9IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5maWx0ZXIoKHQ6IFRyYW5zYWN0aW9uKSA9PiAhdC5pZCk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBjaGlsZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIGlmIChjaGlsZFRyYW5zYWN0aW9uc1RvVXBkYXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhdGNoKGNoaWxkVHJhbnNhY3Rpb25zVG9VcGRhdGUpLnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgY2hpbGQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICBpZiAoY2hpbGRUcmFuc2FjdGlvbnNUb0FkZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRCYXRjaChjaGlsZFRyYW5zYWN0aW9uc1RvQWRkKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKE1lc3NhZ2VzRW51bS5VUERBVEVEX01FU1NBR0UpO1xuXG4gICAgICAgICAgcmVwbGFjZSh0aGlzLmNhY2hlLCB1cGRhdGVkVHJhbnNhY3Rpb24pO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlZFRyYW5zYWN0aW9uO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgbXVsdGlwbGUgdHJhbnNhY3Rpb25zXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbnMgbGlzdCBvZiB0cmFuc2FjdGlvbnMgZm9yIHVwZGF0aW5nXG4gICAqL1xuICB1cGRhdGVCYXRjaCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfWAsIHRyYW5zYWN0aW9ucylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkJhc2VbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSByZXNwb25zZS5tYXAoKGl0ZW06IFRyYW5zYWN0aW9uQmFzZSkgPT4gcGxhaW5Ub0NsYXNzKFRyYW5zYWN0aW9uLCBpdGVtKSk7XG5cbiAgICAgICAgICB1cGRhdGVkVHJhbnNhY3Rpb25zLmZvckVhY2goKHVwZGF0ZWRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHJlcGxhY2UodGhpcy5jYWNoZSwgdXBkYXRlZFRyYW5zYWN0aW9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlZFRyYW5zYWN0aW9ucztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZGVsZXRlIHRyYW5zYWN0aW9uIGFuZCByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gbW9kZWxcbiAgICovXG4gIGRlbGV0ZShtb2RlbDogVHJhbnNhY3Rpb24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfS8ke21vZGVsLmlkfWApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5maWx0ZXIoKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiBkZWxldGUgdHJhbnNmZXIgd2UgZGVsZXRlIGFjdHVhbGx5IDIgdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICBpZiAobW9kZWwuaXNUcmFuc2Zlcikge1xuICAgICAgICAgICAgICBjb25zdCBpZHM6IG51bWJlcltdID0gW21vZGVsLmlkXTtcblxuICAgICAgICAgICAgICAvLyBnZXQgaWQgb2YgcmVsYXRlZCB0cmFuc2ZlciB0cmFuc2FjdGlvblxuICAgICAgICAgICAgICBpZiAobW9kZWwudHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBqdXN0IHRha2UgaWQgaWYgd2UgZGVsZXRlIHNvdXJjZSB0cmFuc2FjdGlvblxuICAgICAgICAgICAgICAgIGlkcy5wdXNoKG1vZGVsLnRyYW5zZmVyLmlkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHNvdXJjZSB0cmFuc2FjdGlvbiBpZCBpZiB3ZSBkZWxldGUgZGVzdGluYXRpb24gdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICBpZHMucHVzaCh0aGlzLmNhY2hlLmZpbmQoKHQ6IFRyYW5zYWN0aW9uKTogYm9vbGVhbiA9PiB0LnRyYW5zZmVyLmlkID09PSBtb2RlbC5pZCkuaWQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuICFpZHMuaW5jbHVkZXModHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb24uaWQgIT09IG1vZGVsLmlkICYmIHRyYW5zYWN0aW9uLnBhcmVudFRyYW5zYWN0aW9uPy5pZCAhPT0gbW9kZWwuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2UuZGlzcGF0Y2goXG4gICAgICAgICAgICBuZXcgQXBwRXZlbnQ8VHJhbnNhY3Rpb24+KEFwcEV2ZW50VHlwZUVudW0uVFJBTlNBQ1RJT05fREVMRVRFRCwgbW9kZWwpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoTWVzc2FnZXNFbnVtLkRFTEVURURfTUVTU0FHRSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlbGV0ZWQuZW1pdChtb2RlbCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwbG9hZCB0cmFuc2FjdGlvbiByZWNlaXB0IGltYWdlXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiDQlWhlIHRyYW5zYWN0aW9uIGZvciB3aGljaCB0aGUgcmVjZWlwdCB3aWxsIGJlIGltcG9ydGVkXG4gICAqL1xuICB1cGxvYWRSZWNlaXB0KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHRyYW5zYWN0aW9uLmZpbGUpO1xuICAgIHRyYW5zYWN0aW9uLnJlY2VpcHQgPSBudWxsO1xuXG4gICAgdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH0vJHt0cmFuc2FjdGlvbi5pZH0vcmVjZWlwdHNgLCBmb3JtRGF0YSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlY2VpcHRSZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBmaWxlIGFmdGVyIHNhdmVcbiAgICAgICAgdHJhbnNhY3Rpb24uZmlsZSA9IG51bGw7XG4gICAgICAgIHRyYW5zYWN0aW9uLnJlY2VpcHQgPSBwbGFpblRvQ2xhc3MoVHJhbnNhY3Rpb25SZWNlaXB0LCByZWNlaXB0UmVzcG9uc2UpO1xuICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlIGdyb3NzIGluY29tZSBhbW91bnQgYmFzZWQgb24gdHJhbnNhY3Rpb24gYW1vdW50IGFuZCB0YXhlcyAoZmVlcylcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIGluc3RhbmNlIGZvciBjYWxjdWxhdGlvblxuICAgKi9cbiAgY2FsY3VsYXRlR3Jvc3NBbW91bnQodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgYW1vdW50OiBudW1iZXIgPSB0cmFuc2FjdGlvbi5hbW91bnQgfHwgMDtcblxuICAgIC8vIGdyb3NzIGluY29tZSBhbW91bnQgaW5jbHVkZXMgYW1vdW50IG9mIGZlZXMgZm9yIHByb3BlcnR5IHRhbmsgYW5kIHRheCBmb3Igd29yayB0YW5rXG4gICAgaWYgKHRyYW5zYWN0aW9uLmlzUHJvcGVydHlUYW5rKCkpIHtcbiAgICAgIGFtb3VudCArPSB0cmFuc2FjdGlvbi50cmFuc2FjdGlvbnMucmVkdWNlKChzdW06IG51bWJlciwgaXRlbTogVHJhbnNhY3Rpb24pID0+IHN1bSArIGl0ZW0uYW1vdW50LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQFRPRE8gQWxleDogZml4IGxvZ2ljIGFmdGVyIFRULTY0MSByZWFkeVxuICAgICAgYW1vdW50ICs9ICh0cmFuc2FjdGlvbi50YXggfHwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFtb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgbGFiZWwgZm9yIHRyYW5zYWN0aW9uIHRheCBmaWVsZCBkZXBlbmRlZCBvZiBzZWxlY3RlZCBjaGFydCBhY2NvdW50LlxuICAgKiB0YXggdHlwZSBkZXBlbmRzIG9mIGNoYXJ0IGFjY291bnQgaGVhZGluZyBvciBjYXRlZ29yeS5cbiAgICovXG4gIGdldFRheExhYmVsKGNoYXJ0QWNjb3VudHM6IENoYXJ0QWNjb3VudHMpOiBDaGFydEFjY291bnRzVGF4TGFiZWxzRW51bSB7XG4gICAgLy8gZ2V0IHNpbXBsZSBhcnJheSBvZiBpZHMgZnJvbSBlbnVtIHdpdGggdGF4YWJsZSBjaGFydCBhY2NvdW50cyBoZWFkaW5nc1xuICAgIGNvbnN0IHRheGFibGVDQUhlYWRpbmdzSWRzOiBudW1iZXJbXSA9IGVudW1Ub0xpc3QoQ2hhcnRBY2NvdW50c0hlYWRpbmdUYXhhYmxlRW51bSlcbiAgICAgIC5tYXAoKGl0ZW06IHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IG51bWJlciB9KSA9PiBpdGVtLnZhbHVlKTtcbiAgICAvLyBnZXQgc2ltcGxlIGFycmF5IG9mIGlkcyBmcm9tIGVudW0gd2l0aCB0YXggZGVkdWN0aWJsZSBjaGFydCBhY2NvdW50cyBoZWFkaW5nc1xuICAgIGNvbnN0IGRlZHVjdGlibGVDQUhlYWRpbmdzSWRzOiBudW1iZXJbXSA9IGVudW1Ub0xpc3QoQ2hhcnRBY2NvdW50c0hlYWRpbmdUYXhEZWR1Y3RpYmxlRW51bSlcbiAgICAgIC5tYXAoKGl0ZW06IHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IG51bWJlciB9KSA9PiBpdGVtLnZhbHVlKTtcblxuICAgIC8vIGNoZWNrIGlmIG9uZSBvZiBpZHMgYXJyYXlzIGluY2x1ZGVzIGN1cnJlbnQgY2hhcnQgYWNjb3VudHMgaGVhZGluZyBpZCBhbmQgc2V0IHRheCBsYWJlbFxuICAgIC8vIG90aGVyd2lzZSBsYWJlbCBpcyBlbXB0eSBmb3IgdGhpcyBjbGFzc1xuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0YXhhYmxlQ0FIZWFkaW5nc0lkcy5pbmNsdWRlcyhjaGFydEFjY291bnRzLmhlYWRpbmc/LmlkKTpcbiAgICAgICAgcmV0dXJuIENoYXJ0QWNjb3VudHNUYXhMYWJlbHNFbnVtLlRBWF9QQUlEO1xuICAgICAgY2FzZSBkZWR1Y3RpYmxlQ0FIZWFkaW5nc0lkcy5pbmNsdWRlcyhjaGFydEFjY291bnRzLmhlYWRpbmc/LmlkKTpcbiAgICAgICAgcmV0dXJuIENoYXJ0QWNjb3VudHNUYXhMYWJlbHNFbnVtLlRBWF9ERURVQ1RFRDtcbiAgICAgIGNhc2UgQ0hBUlRfQUNDT1VOVFNfQ0FURUdPUklFUy53b3JrSW5jb21lLmluY2x1ZGVzKGNoYXJ0QWNjb3VudHMuY2F0ZWdvcnkpOlxuICAgICAgICByZXR1cm4gQ2hhcnRBY2NvdW50c1RheExhYmVsc0VudW0uVEFYX1dJVEhIRUxEO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBFdmVudERpc3BhdGNoZXJTZXJ2aWNlIGV2ZW50IHJlbGF0ZWQgdG8gRGVwcmVjaWF0aW9uIGNoYW5naW5nXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbkRlcHJlY2lhdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2Uub24oQXBwRXZlbnRUeXBlRW51bS5ERVBSRUNJQVRJT05fREVMRVRFRCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2goKVxuICAgICAgICAuc3Vic2NyaWJlKCh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gdHJhbnNhY3Rpb25zO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIHRvIEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UgZXZlbnQgcmVsYXRlZCB0byBQcm9wZXJ0eSBTaGFyZSBjaGFuZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5Qcm9wZXJ0eVNoYXJlVXBkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyU2VydmljZS5vbihBcHBFdmVudFR5cGVFbnVtLlBST1BFUlRZX1NIQVJFX1VQREFURUQpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2V0Q2FjaGUoKSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwtdmlkZW8tcmVzcG9uc2UuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2h0dHAvdHV0b3JpYWwtdmlkZW8vdHV0b3JpYWwtdmlkZW8tcmVzcG9uc2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1ZpZGVvU291cmNlfSBmcm9tIFwiLi92aWRlby1zb3VyY2UuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHV0b3JpYWxWaWRlb1Jlc3BvbnNlIHtcbiAgZmlsZXM6IFZpZGVvU291cmNlW107XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { map } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ // @TODO Artem: implement cache and extend rest?
6
+ export class TutorialVideoService {
7
+ constructor(http, environment) {
8
+ this.http = http;
9
+ this.environment = environment;
10
+ }
11
+ get() {
12
+ return this.http.get(`${TutorialVideoService.googleUrl}&q='${TutorialVideoService.parents}'+in+parents&key=${this.environment.googleDriveId}`)
13
+ .pipe(map((response) => response.files));
14
+ }
15
+ }
16
+ TutorialVideoService.googleUrl = `https://www.googleapis.com/drive/v3/files?fields=*&mimeType='video/mp4'&orderBy=name`;
17
+ TutorialVideoService.parents = '1uLMLzi8WUy2go9xhfzJEwgFwOM43dukM';
18
+ TutorialVideoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TutorialVideoService, deps: [{ token: i1.HttpClient }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable });
19
+ TutorialVideoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TutorialVideoService, providedIn: 'root' });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TutorialVideoService, decorators: [{
21
+ type: Injectable,
22
+ args: [{
23
+ providedIn: 'root'
24
+ }]
25
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
26
+ type: Inject,
27
+ args: ['environment']
28
+ }] }]; } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwtdmlkZW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3R1dG9yaWFsLXZpZGVvL3R1dG9yaWFsLXZpZGVvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7QUFJbkMsZ0RBQWdEO0FBSWhELE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsWUFDVSxJQUFnQixFQUNTLFdBQWdCO1FBRHpDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDUyxnQkFBVyxHQUFYLFdBQVcsQ0FBSztJQUVuRCxDQUFDO0lBRUQsR0FBRztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMzSSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBK0IsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUN6RCxDQUFBO0lBQ0wsQ0FBQzs7QUFkTSw4QkFBUyxHQUFXLHNGQUFzRixDQUFDO0FBQzNHLDRCQUFPLEdBQVcsbUNBQW1DLENBQUM7a0hBRmxELG9CQUFvQiw0Q0FNckIsYUFBYTtzSEFOWixvQkFBb0IsY0FGbkIsTUFBTTs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFPSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtWaWRlb1NvdXJjZX0gZnJvbSAnLi92aWRlby1zb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7VHV0b3JpYWxWaWRlb1Jlc3BvbnNlfSBmcm9tICcuL3R1dG9yaWFsLXZpZGVvLXJlc3BvbnNlLmludGVyZmFjZSc7XG5cbi8vIEBUT0RPIEFydGVtOiBpbXBsZW1lbnQgY2FjaGUgYW5kIGV4dGVuZCByZXN0P1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHV0b3JpYWxWaWRlb1NlcnZpY2Uge1xuICBzdGF0aWMgZ29vZ2xlVXJsOiBzdHJpbmcgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZHJpdmUvdjMvZmlsZXM/ZmllbGRzPSombWltZVR5cGU9J3ZpZGVvL21wNCcmb3JkZXJCeT1uYW1lYDtcbiAgc3RhdGljIHBhcmVudHM6IHN0cmluZyA9ICcxdUxNTHppOFdVeTJnbzl4aGZ6SkV3Z0Z3T000M2R1a00nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogYW55XG4gICkge1xuICB9XG5cbiAgZ2V0KCk6IE9ic2VydmFibGU8VmlkZW9Tb3VyY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke1R1dG9yaWFsVmlkZW9TZXJ2aWNlLmdvb2dsZVVybH0mcT0nJHtUdXRvcmlhbFZpZGVvU2VydmljZS5wYXJlbnRzfScraW4rcGFyZW50cyZrZXk9JHt0aGlzLmVudmlyb25tZW50Lmdvb2dsZURyaXZlSWR9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBUdXRvcmlhbFZpZGVvUmVzcG9uc2UpID0+IHJlc3BvbnNlLmZpbGVzKVxuICAgICAgKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Interface for inserts video (iframe, video)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tc291cmNlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3R1dG9yaWFsLXZpZGVvL3ZpZGVvLXNvdXJjZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyZmFjZSBmb3IgaW5zZXJ0cyB2aWRlbyAoaWZyYW1lLCB2aWRlbylcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvU291cmNlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzcmM6IHN0cmluZztcbiAgd2ViQ29udGVudExpbms6IHN0cmluZztcbn1cbiJdfQ==
@@ -23,12 +23,12 @@ export class PropertyCalculationService {
23
23
  }));
24
24
  }
25
25
  taxPositionGrowth(properties, transactions, depreciations) {
26
- const taxPosition = this.getTaxPosition(transactions, depreciations);
27
- // check if taxPosition = 0 to avoid division by zero
28
- if (!taxPosition) {
26
+ const forecastedTaxPosition = properties.sumBy('forecastedTaxPosition');
27
+ // check if forecastedTaxPosition = 0 to avoid division by zero
28
+ if (!forecastedTaxPosition) {
29
29
  return 0;
30
30
  }
31
- return (taxPosition - properties.forecastedTaxPosition) / taxPosition;
31
+ return (this.getTaxPosition(transactions, depreciations) - forecastedTaxPosition) / forecastedTaxPosition;
32
32
  }
33
33
  taxPositionGrowth$(properties$, transactions$, depreciations$) {
34
34
  return combineLatest([
@@ -89,11 +89,12 @@ export class PropertyCalculationService {
89
89
  }
90
90
  getLvrGrowth(properties, bankAccounts, loans) {
91
91
  const lvr = this.getLvr(properties, bankAccounts);
92
- if (!lvr) {
93
- // check if lvr = 0 to avoid division by zero
92
+ const lvrCommencement = this.getLvrCommencement(properties, loans, bankAccounts);
93
+ if (!lvrCommencement) {
94
+ // check if lvrCommencement = 0 to avoid division by zero
94
95
  return 0;
95
96
  }
96
- return (lvr - this.getLvrCommencement(properties, loans, bankAccounts)) / lvr;
97
+ return (this.getLvr(properties, bankAccounts) - lvrCommencement) / lvrCommencement;
97
98
  }
98
99
  getLvrGrowth$(properties$, bankAccounts$, loans$) {
99
100
  return combineLatest([
@@ -104,14 +105,28 @@ export class PropertyCalculationService {
104
105
  return this.getLvrGrowth(properties, bankAccounts, loans);
105
106
  }));
106
107
  }
108
+ /**
109
+ * Equity position = Market value - current loan value
110
+ */
107
111
  getEquityPosition(properties, bankAccounts) {
108
112
  // Math abs is required for correct percentage calculation
109
113
  return properties.marketValue - Math.abs(this.getLoanValue(properties, bankAccounts));
110
114
  }
115
+ /**
116
+ * Purchase Equity = Purchase price - initial loan value
117
+ */
111
118
  getPurchaseEquity(properties, bankAccounts, loans) {
112
119
  // Math abs is required for correct percentage calculation
113
120
  return properties.purchasePrice - Math.abs(this.getLoanAmount(properties, bankAccounts, loans));
114
121
  }
122
+ getEquityGrowth(properties, bankAccounts, loans) {
123
+ const purchaseEquity = this.getPurchaseEquity(properties, bankAccounts, loans);
124
+ // check if purchaseEquity = 0 to avoid division by zero
125
+ if (!purchaseEquity) {
126
+ return 0;
127
+ }
128
+ return (this.getEquityPosition(properties, bankAccounts) - purchaseEquity) / purchaseEquity;
129
+ }
115
130
  /**
116
131
  * Get dictionary of badges for each property in collection
117
132
  */
@@ -122,6 +137,14 @@ export class PropertyCalculationService {
122
137
  });
123
138
  return badgesByProperty;
124
139
  }
140
+ getCashPositionGrowth(properties, transactions) {
141
+ const forecastedCashPosition = properties.sumBy('forecastedCashPosition');
142
+ // check if forecastedCashPosition = 0 to avoid division by zero
143
+ if (!forecastedCashPosition) {
144
+ return 0;
145
+ }
146
+ return (transactions.cashPosition - forecastedCashPosition) / forecastedCashPosition;
147
+ }
125
148
  /**
126
149
  * Get Badge for single property in collection
127
150
  */
@@ -152,4 +175,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
152
175
  providedIn: 'root'
153
176
  }]
154
177
  }] });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktY2FsY3VsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9wcm9wZXJ0eS9wcm9wZXJ0eS1jYWxjdWxhdGlvbi9wcm9wZXJ0eS1jYWxjdWxhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRXhFOzs7R0FHRztBQUlILE1BQU0sT0FBTywwQkFBMEI7SUFDckMsY0FBYyxDQUFDLFlBQW1DLEVBQUUsYUFBcUM7UUFDdkYsOEVBQThFO1FBQzlFLE9BQU8sWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsZUFBZSxDQUNiLGFBQWdELEVBQ2hELGNBQWtEO1FBRWxELE9BQU8sYUFBYSxDQUFDO1lBQ25CLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQWtELEVBQVUsRUFBRTtZQUM3RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlC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Z0JBQWdCLEdBQXVCLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzlFLE1BQU0sNkJBQTZCLEdBQWEsZ0JBQWdCLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUNwRyxNQUFNLDBCQUEwQixHQUFhLGdCQUFnQixDQUFDLDZCQUE2QixDQUN6RixZQUFZLEVBQUUsYUFBYSxDQUM1QixDQUFDO1FBRUYsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7Z0JBQ3JCLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFLLFFBQVEsQ0FBQyxFQUFFLEtBQUssMEJBQTBCLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssNkJBQTZCLENBQUMsRUFBRTtnQkFDcEcsT0FBTyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekUsS0FBSyxRQUFRLENBQUMsRUFBRSxLQUFLLDBCQUEwQixDQUFDLEVBQUU7Z0JBQ2hELE9BQU8sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hFLEtBQUssUUFBUSxDQUFDLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxFQUFFO2dCQUNuRCxPQUFPLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRTtnQkFDRSxPQUFPLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDOzt3SEF4TFUsMEJBQTBCOzRIQUExQiwwQkFBMEIsY0FGekIsTUFBTTs0RkFFUCwwQkFBMEI7a0JBSHRDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFua0FjY291bnRDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvYmFuay1hY2NvdW50LmNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgRGVwcmVjaWF0aW9uQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbGxlY3Rpb25zL2RlcHJlY2lhdGlvbi5jb2xsZWN0aW9uJztcbmltcG9ydCB7IExvYW5Db2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvbG9hbi9sb2FuLmNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgUHJvcGVydHlDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvcHJvcGVydHkvcHJvcGVydHkuY29sbGVjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb2xsZWN0aW9ucy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbi5jb2xsZWN0aW9uJztcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Byb3BlcnR5L3Byb3BlcnR5JztcbmltcG9ydCB7IEJhbmtBY2NvdW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2JhbmsvYmFuay1hY2NvdW50JztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGljdGlvbmFyeS9kaWN0aW9uYXJ5JztcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2JhZGdlL2JhZGdlJztcbmltcG9ydCB7IEJhZGdlQ29sb3JFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2JhZGdlL2JhZGdlLWNvbG9yLmVudW0nO1xuXG4vKipcbiAqIFNlcnZpY2Ugd2l0aCBjYWxjdWxhdGlvbnMgbWV0aG9kcyBmb3IgcHJvcGVydGllcyByZWxhdGVkIHdpdGggb3RoZXIgZW50aXRpZXMuXG4gKiBMb2dpYyBoZXJlIHdvcmtzIGxpa2UgY29sbGVjdGlvbnMgbWV0aG9kcyBidXQgZm9yIHNldmVyYWwgZW50aXRpZXNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlDYWxjdWxhdGlvblNlcnZpY2Uge1xuICBnZXRUYXhQb3NpdGlvbih0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uQ29sbGVjdGlvbiwgZGVwcmVjaWF0aW9uczogRGVwcmVjaWF0aW9uQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgLy8gQFRPRE8gaGFjazogbWF0aCBhYnMgYWRkZWQgYmVjYXVzZSB3ZSBoYXZlIG1pc21hdGNoaW5nIG9mIHJlYWwgdmFsdWVzIHNpZ25zXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucy5jYXNoUG9zaXRpb24gLSBNYXRoLmFicyhkZXByZWNpYXRpb25zLmNsYWltQW1vdW50KTtcbiAgfVxuXG4gIGdldFRheFBvc2l0aW9uJChcbiAgICB0cmFuc2FjdGlvbnMkOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uQ29sbGVjdGlvbj4sXG4gICAgZGVwcmVjaWF0aW9ucyQ6IE9ic2VydmFibGU8RGVwcmVjaWF0aW9uQ29sbGVjdGlvbj5cbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0cmFuc2FjdGlvbnMkLFxuICAgICAgZGVwcmVjaWF0aW9ucyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbdHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zXTogW1RyYW5zYWN0aW9uQ29sbGVjdGlvbiwgRGVwcmVjaWF0aW9uQ29sbGVjdGlvbl0pOiBudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUYXhQb3NpdGlvbih0cmFuc2FjdGlvbnMsIGRlcHJlY2lhdGlvbnMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdGF4UG9zaXRpb25Hcm93dGgocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uQ29sbGVjdGlvbiwgZGVwcmVjaWF0aW9uczogRGVwcmVjaWF0aW9uQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgY29uc3QgdGF4UG9zaXRpb246IG51bWJlciA9IHRoaXMuZ2V0VGF4UG9zaXRpb24odHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zKTtcbiAgICAvLyBjaGVjayBpZiB0YXhQb3NpdGlvbiA9IDAgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVyb1xuICAgIGlmICghdGF4UG9zaXRpb24pIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAodGF4UG9zaXRpb24gLSBwcm9wZXJ0aWVzLmZvcmVjYXN0ZWRUYXhQb3NpdGlvbikgLyB0YXhQb3NpdGlvbjtcbiAgfVxuXG4gIHRheFBvc2l0aW9uR3Jvd3RoJChcbiAgICBwcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxQcm9wZXJ0eUNvbGxlY3Rpb24+LFxuICAgIHRyYW5zYWN0aW9ucyQ6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25Db2xsZWN0aW9uPixcbiAgICBkZXByZWNpYXRpb25zJDogT2JzZXJ2YWJsZTxEZXByZWNpYXRpb25Db2xsZWN0aW9uPlxuICApOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHByb3BlcnRpZXMkLFxuICAgICAgdHJhbnNhY3Rpb25zJCxcbiAgICAgIGRlcHJlY2lhdGlvbnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3Byb3BlcnRpZXMsIHRyYW5zYWN0aW9ucywgZGVwcmVjaWF0aW9uc106IFtQcm9wZXJ0eUNvbGxlY3Rpb24sIFRyYW5zYWN0aW9uQ29sbGVjdGlvbiwgRGVwcmVjaWF0aW9uQ29sbGVjdGlvbl0pOiBudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YXhQb3NpdGlvbkdyb3d0aChwcm9wZXJ0aWVzLCB0cmFuc2FjdGlvbnMsIGRlcHJlY2lhdGlvbnMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVudGFsUmV0dXJuKHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb24pOiBudW1iZXIge1xuICAgIHJldHVybiB0cmFuc2FjdGlvbnMuY2xhaW1JbmNvbWUgLyBwcm9wZXJ0aWVzLm1hcmtldFZhbHVlO1xuICB9XG5cbiAgZ2V0TG9hbkFtb3VudChwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIGJhbmtBY2NvdW50czogQmFua0FjY291bnRDb2xsZWN0aW9uLCBsb2FuczogTG9hbkNvbGxlY3Rpb24pOiBudW1iZXIge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzLml0ZW1zLnJlZHVjZSgodG90YWxBbW91bnQ6IG51bWJlciwgcHJvcGVydHk6IFByb3BlcnR5KTogbnVtYmVyID0+IHtcbiAgICAgIHJldHVybiB0b3RhbEFtb3VudCArIGJhbmtBY2NvdW50cy5pdGVtc1xuICAgICAgICAucmVkdWNlKChwcm9wZXJ0eUFtb3VudDogbnVtYmVyLCBiYW5rQWNjb3VudDogQmFua0FjY291bnQpOiBudW1iZXIgPT4ge1xuICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUFtb3VudCArIGJhbmtBY2NvdW50LmdldFByb3BlcnR5UGVyY2VudGFnZShwcm9wZXJ0eS5pZCkgKiAobG9hbnMuZ2V0QnlCYW5rQWNjb3VudElkKGJhbmtBY2NvdW50LmlkKT8uYW1vdW50IHx8IDApO1xuICAgICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldExvYW5WYWx1ZShwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIGJhbmtBY2NvdW50czogQmFua0FjY291bnRDb2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcHJvcGVydGllcy5pdGVtcy5yZWR1Y2UoKHRvdGFsQW1vdW50OiBudW1iZXIsIHByb3BlcnR5OiBQcm9wZXJ0eSk6IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gdG90YWxBbW91bnQgKyBiYW5rQWNjb3VudHMuaXRlbXNcbiAgICAgICAgLnJlZHVjZSgocHJvcGVydHlBbW91bnQ6IG51bWJlciwgYmFua0FjY291bnQ6IEJhbmtBY2NvdW50KTogbnVtYmVyID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvcGVydHlBbW91bnQgKyBiYW5rQWNjb3VudC5nZXRQcm9wZXJ0eUJhbGFuY2VBbW91bnQocHJvcGVydHkuaWQpO1xuICAgICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMVlJcbiAgICovXG5cbiAgZ2V0THZyKHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgYmFua0FjY291bnRzOiBCYW5rQWNjb3VudENvbGxlY3Rpb24pOiBudW1iZXIge1xuICAgIC8vIE1hdGggYWJzIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHBlcmNlbnRhZ2UgY2FsY3VsYXRpb25cbiAgICByZXR1cm4gTWF0aC5hYnModGhpcy5nZXRMb2FuVmFsdWUocHJvcGVydGllcywgYmFua0FjY291bnRzKSkgLyBwcm9wZXJ0aWVzLm1hcmtldFZhbHVlO1xuICB9XG5cbiAgZ2V0THZyJChcbiAgICBwcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxQcm9wZXJ0eUNvbGxlY3Rpb24+LFxuICAgIGJhbmtBY2NvdW50cyQ6IE9ic2VydmFibGU8QmFua0FjY291bnRDb2xsZWN0aW9uPlxuICApOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHByb3BlcnRpZXMkLFxuICAgICAgYmFua0FjY291bnRzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHNdOiBbUHJvcGVydHlDb2xsZWN0aW9uLCBCYW5rQWNjb3VudENvbGxlY3Rpb25dKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0THZyKHByb3BlcnRpZXMsIGJhbmtBY2NvdW50cyk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRMdnJDb21tZW5jZW1lbnQocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCBsb2FuczogTG9hbkNvbGxlY3Rpb24sIGJhbmtBY2NvdW50czogQmFua0FjY291bnRDb2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBNYXRoIGFicyBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBwZXJjZW50YWdlIGNhbGN1bGF0aW9uXG4gICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0TG9hbkFtb3VudChwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHMsIGxvYW5zKSkgLyBwcm9wZXJ0aWVzLnB1cmNoYXNlUHJpY2U7XG4gIH1cblxuICBnZXRMdnJDb21tZW5jZW1lbnQkKFxuICAgIHByb3BlcnRpZXMkOiBPYnNlcnZhYmxlPFByb3BlcnR5Q29sbGVjdGlvbj4sXG4gICAgYmFua0FjY291bnRzJDogT2JzZXJ2YWJsZTxCYW5rQWNjb3VudENvbGxlY3Rpb24+LFxuICAgIGxvYW5zJDogT2JzZXJ2YWJsZTxMb2FuQ29sbGVjdGlvbj5cbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICBwcm9wZXJ0aWVzJCxcbiAgICAgIGJhbmtBY2NvdW50cyQsXG4gICAgICBsb2FucyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcHJvcGVydGllcywgYmFua0FjY291bnRzLCBsb2Fuc106IFtQcm9wZXJ0eUNvbGxlY3Rpb24sIEJhbmtBY2NvdW50Q29sbGVjdGlvbiwgTG9hbkNvbGxlY3Rpb25dKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0THZyQ29tbWVuY2VtZW50KHByb3BlcnRpZXMsIGxvYW5zLCBiYW5rQWNjb3VudHMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0THZyR3Jvd3RoKHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgYmFua0FjY291bnRzOiBCYW5rQWNjb3VudENvbGxlY3Rpb24sIGxvYW5zOiBMb2FuQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgY29uc3QgbHZyOiBudW1iZXIgPSB0aGlzLmdldEx2cihwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHMpO1xuICAgIGlmICghbHZyKSB7XG4gICAgICAvLyBjaGVjayBpZiBsdnIgPSAwIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm9cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAobHZyIC0gdGhpcy5nZXRMdnJDb21tZW5jZW1lbnQocHJvcGVydGllcywgbG9hbnMsIGJhbmtBY2NvdW50cykpIC8gbHZyO1xuICB9XG5cbiAgZ2V0THZyR3Jvd3RoJChcbiAgICBwcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxQcm9wZXJ0eUNvbGxlY3Rpb24+LFxuICAgIGJhbmtBY2NvdW50cyQ6IE9ic2VydmFibGU8QmFua0FjY291bnRDb2xsZWN0aW9uPixcbiAgICBsb2FucyQ6IE9ic2VydmFibGU8TG9hbkNvbGxlY3Rpb24+XG4gICk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgcHJvcGVydGllcyQsXG4gICAgICBiYW5rQWNjb3VudHMkLFxuICAgICAgbG9hbnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3Byb3BlcnRpZXMsIGJhbmtBY2NvdW50cywgbG9hbnNdOiBbUHJvcGVydHlDb2xsZWN0aW9uLCBCYW5rQWNjb3VudENvbGxlY3Rpb24sIExvYW5Db2xsZWN0aW9uXSk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEx2ckdyb3d0aChwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHMsIGxvYW5zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEVxdWl0eVBvc2l0aW9uKHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgYmFua0FjY291bnRzOiBCYW5rQWNjb3VudENvbGxlY3Rpb24pOiBudW1iZXIge1xuICAgIC8vIE1hdGggYWJzIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHBlcmNlbnRhZ2UgY2FsY3VsYXRpb25cbiAgICByZXR1cm4gcHJvcGVydGllcy5tYXJrZXRWYWx1ZSAtIE1hdGguYWJzKHRoaXMuZ2V0TG9hblZhbHVlKHByb3BlcnRpZXMsIGJhbmtBY2NvdW50cykpO1xuICB9XG5cbiAgZ2V0UHVyY2hhc2VFcXVpdHkocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCBiYW5rQWNjb3VudHM6IEJhbmtBY2NvdW50Q29sbGVjdGlvbiwgbG9hbnM6IExvYW5Db2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBNYXRoIGFicyBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBwZXJjZW50YWdlIGNhbGN1bGF0aW9uXG4gICAgcmV0dXJuIHByb3BlcnRpZXMucHVyY2hhc2VQcmljZSAtIE1hdGguYWJzKHRoaXMuZ2V0TG9hbkFtb3VudChwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHMsIGxvYW5zKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpY3Rpb25hcnkgb2YgYmFkZ2VzIGZvciBlYWNoIHByb3BlcnR5IGluIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldEJhZGdlc0J5UHJvcGVydHkocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uQ29sbGVjdGlvbiwgZGVwcmVjaWF0aW9uczogRGVwcmVjaWF0aW9uQ29sbGVjdGlvbik6IERpY3Rpb25hcnk8QmFkZ2U+IHtcbiAgICBjb25zdCBiYWRnZXNCeVByb3BlcnR5ID0gbmV3IERpY3Rpb25hcnkoW10pO1xuXG4gICAgcHJvcGVydGllcy50b0FycmF5KCkuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG4gICAgICBiYWRnZXNCeVByb3BlcnR5LmFkZChwcm9wZXJ0eS5pZCwgdGhpcy5nZXRCYWRnZShwcm9wZXJ0eSwgcHJvcGVydGllcywgdHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmFkZ2VzQnlQcm9wZXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQmFkZ2UgZm9yIHNpbmdsZSBwcm9wZXJ0eSBpbiBjb2xsZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldEJhZGdlKHByb3BlcnR5OiBQcm9wZXJ0eSwgcHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uQ29sbGVjdGlvbiwgZGVwcmVjaWF0aW9uczogRGVwcmVjaWF0aW9uQ29sbGVjdGlvbik6IEJhZGdlIHtcbiAgICAvLyBiZXN0IHBlcmZvcm1hbmNlIHByb3BlcnRpZXMgY291bGQgYmUgb25seSBmcm9tIGFjdGl2ZSBwcm9wZXJ0aWVzIGxpc3RcbiAgICBjb25zdCBhY3RpdmVQcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24gPSBwcm9wZXJ0aWVzLmdldEFjdGl2ZVByb3BlcnRpZXMoKTtcbiAgICBjb25zdCBiZXN0UGVyZm9ybWFuY2VHcm93dGhQcm9wZXJ0eTogUHJvcGVydHkgPSBhY3RpdmVQcm9wZXJ0aWVzLmdldEJlc3RQZXJmb3JtYW5jZUdyb3d0aFByb3BlcnR5KCk7XG4gICAgY29uc3QgYmVzdFBlcmZvcm1hbmNlVGF4UHJvcGVydHk6IFByb3BlcnR5ID0gYWN0aXZlUHJvcGVydGllcy5nZXRCZXN0UGVyZm9ybWFuY2VUYXhQcm9wZXJ0eShcbiAgICAgIHRyYW5zYWN0aW9ucywgZGVwcmVjaWF0aW9uc1xuICAgICk7XG5cbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgIXByb3BlcnR5LmlzQWN0aXZlOlxuICAgICAgICByZXR1cm4gbmV3IEJhZGdlKCdJbmFjdGl2ZScsIEJhZGdlQ29sb3JFbnVtLkdSQVkpO1xuICAgICAgY2FzZSBwcm9wZXJ0eS5pZCA9PT0gYmVzdFBlcmZvcm1hbmNlVGF4UHJvcGVydHkuaWQgJiYgcHJvcGVydHkuaWQgPT09IGJlc3RQZXJmb3JtYW5jZUdyb3d0aFByb3BlcnR5LmlkOlxuICAgICAgICByZXR1cm4gbmV3IEJhZGdlKCdCZXN0IHBlcmZvcm1hbmNlIGdyb3d0aCAmIHRheCcsIEJhZGdlQ29sb3JFbnVtLkdPTEQpO1xuICAgICAgY2FzZSBwcm9wZXJ0eS5pZCA9PT0gYmVzdFBlcmZvcm1hbmNlVGF4UHJvcGVydHkuaWQ6XG4gICAgICAgIHJldHVybiBuZXcgQmFkZ2UoJ0Jlc3QgcGVyZm9ybWFuY2UgdGF4JywgQmFkZ2VDb2xvckVudW0uR09MRCk7XG4gICAgICBjYXNlIHByb3BlcnR5LmlkID09PSBiZXN0UGVyZm9ybWFuY2VHcm93dGhQcm9wZXJ0eS5pZDpcbiAgICAgICAgcmV0dXJuIG5ldyBCYWRnZSgnQmVzdCBwZXJmb3JtYW5jZSBncm93dGgnLCBCYWRnZUNvbG9yRW51bS5HUkVFTik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEJhZGdlKCdNb25pdG9yaW5nIHBlcmZvcm1hbmNlJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktY2FsY3VsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9wcm9wZXJ0eS9wcm9wZXJ0eS1jYWxjdWxhdGlvbi9wcm9wZXJ0eS1jYWxjdWxhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRXhFOzs7R0FHRztBQUlILE1BQU0sT0FBTywwQkFBMEI7SUFDckMsY0FBYyxDQUFDLFlBQW1DLEVBQUUsYUFBcUM7UUFDdkYsOEVBQThFO1FBQzlFLE9BQU8sWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsZUFBZSxDQUNiLGFBQWdELEVBQ2hELGNBQWtEO1FBRWxELE9BQU8sYUFBYSxDQUFDO1lBQ25CLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQWtELEVBQVUsRUFBRTtZQUM3RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBOEIsRUFBRSxZQUFtQyxFQUFFLGFBQXFDO1FBQzFILE1BQU0scUJBQXFCLEdBQVcsVUFBVSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hGLCtEQUErRDtRQUMvRCxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDMUIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO0lBQzVHLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsV0FBMkMsRUFDM0MsYUFBZ0QsRUFDaEQsY0FBa0Q7UUFFbEQsT0FBTyxhQUFhLENBQUM7WUFDbkIsV0FBVztZQUNYLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFzRSxFQUFVLEVBQUU7WUFDN0gsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUE4QixFQUFFLFlBQW1DO1FBQ2pGLE9BQU8sWUFBWSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQzNELENBQUM7SUFFRCxhQUFhLENBQUMsVUFBOEIsRUFBRSxZQUFtQyxFQUFFLEtBQXFCO1FBQ3RHLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFtQixFQUFFLFFBQWtCLEVBQVUsRUFBRTtZQUNqRixPQUFPLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSztpQkFDcEMsTUFBTSxDQUFDLENBQUMsY0FBc0IsRUFBRSxXQUF3QixFQUFVLEVBQUU7O2dCQUNuRSxPQUFPLGNBQWMsR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLDBDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUMsQ0FBQztZQUNuSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQThCLEVBQUUsWUFBbUM7UUFDOUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQW1CLEVBQUUsUUFBa0IsRUFBVSxFQUFFO1lBQ2pGLE9BQU8sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLO2lCQUNwQyxNQUFNLENBQUMsQ0FBQyxjQUFzQixFQUFFLFdBQXdCLEVBQVUsRUFBRTtnQkFDbkUsT0FBTyxjQUFjLEdBQUcsV0FBVyxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQ7O09BRUc7SUFFSCxNQUFNLENBQUMsVUFBOEIsRUFBRSxZQUFtQztRQUN4RSwwREFBMEQ7UUFDMUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUN4RixDQUFDO0lBRUQsT0FBTyxDQUNMLFdBQTJDLEVBQzNDLGFBQWdEO1FBRWhELE9BQU8sYUFBYSxDQUFDO1lBQ25CLFdBQVc7WUFDWCxhQUFhO1NBQ2QsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQThDLEVBQVUsRUFBRTtZQUN0RixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBOEIsRUFBRSxLQUFxQixFQUFFLFlBQW1DO1FBQzNHLDBEQUEwRDtRQUMxRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUNsRyxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLFdBQTJDLEVBQzNDLGFBQWdELEVBQ2hELE1BQWtDO1FBRWxDLE9BQU8sYUFBYSxDQUFDO1lBQ25CLFdBQVc7WUFDWCxhQUFhO1lBQ2IsTUFBTTtTQUNQLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBOEQsRUFBVSxFQUFFO1lBQzdHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBOEIsRUFBRSxZQUFtQyxFQUFFLEtBQXFCO1FBQ3JHLE1BQU0sR0FBRyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFELE1BQU0sZUFBZSxHQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEIseURBQXlEO1lBQ3pELE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsZUFBZSxDQUFDLEdBQUcsZUFBZSxDQUFDO0lBQ3JGLENBQUM7SUFFRCxhQUFhLENBQ1gsV0FBMkMsRUFDM0MsYUFBZ0QsRUFDaEQsTUFBa0M7UUFFbEMsT0FBTyxhQUFhLENBQUM7WUFDbkIsV0FBVztZQUNYLGFBQWE7WUFDYixNQUFNO1NBQ1AsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUE4RCxFQUFVLEVBQUU7WUFDN0csT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLFVBQThCLEVBQUUsWUFBbUM7UUFDbkYsMERBQTBEO1FBQzFELE9BQU8sVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCLENBQUMsVUFBOEIsRUFBRSxZQUFtQyxFQUFFLEtBQXFCO1FBQzFHLDBEQUEwRDtRQUMxRCxPQUFPLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsZUFBZSxDQUFDLFVBQThCLEVBQUUsWUFBbUMsRUFBRSxLQUFxQjtRQUN4RyxNQUFNLGNBQWMsR0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2Rix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsY0FBYyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLFVBQThCLEVBQUUsWUFBbUMsRUFBRSxhQUFxQztRQUM1SCxNQUFNLGdCQUFnQixHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFrQixFQUFFLEVBQUU7WUFDbEQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQscUJBQXFCLENBQUMsVUFBOEIsRUFBRSxZQUFtQztRQUN2RixNQUFNLHNCQUFzQixHQUFXLFVBQVUsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUVsRixnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzNCLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLHNCQUFzQixDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7T0FFRztJQUNLLFFBQVEsQ0FBQyxRQUFrQixFQUFFLFVBQThCLEVBQUUsWUFBbUMsRUFBRSxhQUFxQztRQUM3SSx3RUFBd0U7UUFDeEUsTUFBTSxnQkFBZ0IsR0FBdUIsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDOUUsTUFBTSw2QkFBNkIsR0FBYSxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3BHLE1BQU0sMEJBQTBCLEdBQWEsZ0JBQWdCLENBQUMsNkJBQTZCLENBQ3pGLFlBQVksRUFBRSxhQUFhLENBQzVCLENBQUM7UUFFRixRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDckIsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELEtBQUssUUFBUSxDQUFDLEVBQUUsS0FBSywwQkFBMEIsQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxFQUFFO2dCQUNwRyxPQUFPLElBQUksS0FBSyxDQUFDLCtCQUErQixFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RSxLQUFLLFFBQVEsQ0FBQyxFQUFFLEtBQUssMEJBQTBCLENBQUMsRUFBRTtnQkFDaEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEUsS0FBSyxRQUFRLENBQUMsRUFBRSxLQUFLLDZCQUE2QixDQUFDLEVBQUU7Z0JBQ25ELE9BQU8sSUFBSSxLQUFLLENBQUMseUJBQXlCLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BFO2dCQUNFLE9BQU8sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUM7O3dIQXBOVSwwQkFBMEI7NEhBQTFCLDBCQUEwQixjQUZ6QixNQUFNOzRGQUVQLDBCQUEwQjtrQkFIdEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYW5rQWNjb3VudENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb2xsZWN0aW9ucy9iYW5rLWFjY291bnQuY29sbGVjdGlvbic7XG5pbXBvcnQgeyBEZXByZWNpYXRpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvZGVwcmVjaWF0aW9uLmNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgTG9hbkNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb2xsZWN0aW9ucy9sb2FuL2xvYW4uY29sbGVjdGlvbic7XG5pbXBvcnQgeyBQcm9wZXJ0eUNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb2xsZWN0aW9ucy9wcm9wZXJ0eS9wcm9wZXJ0eS5jb2xsZWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbGxlY3Rpb25zL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLmNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcHJvcGVydHkvcHJvcGVydHknO1xuaW1wb3J0IHsgQmFua0FjY291bnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvYmFuay9iYW5rLWFjY291bnQnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kaWN0aW9uYXJ5L2RpY3Rpb25hcnknO1xuaW1wb3J0IHsgQmFkZ2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvYmFkZ2UvYmFkZ2UnO1xuaW1wb3J0IHsgQmFkZ2VDb2xvckVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvYmFkZ2UvYmFkZ2UtY29sb3IuZW51bSc7XG5cbi8qKlxuICogU2VydmljZSB3aXRoIGNhbGN1bGF0aW9ucyBtZXRob2RzIGZvciBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2l0aCBvdGhlciBlbnRpdGllcy5cbiAqIExvZ2ljIGhlcmUgd29ya3MgbGlrZSBjb2xsZWN0aW9ucyBtZXRob2RzIGJ1dCBmb3Igc2V2ZXJhbCBlbnRpdGllc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUNhbGN1bGF0aW9uU2VydmljZSB7XG4gIGdldFRheFBvc2l0aW9uKHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25Db2xsZWN0aW9uLCBkZXByZWNpYXRpb25zOiBEZXByZWNpYXRpb25Db2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBAVE9ETyBoYWNrOiBtYXRoIGFicyBhZGRlZCBiZWNhdXNlIHdlIGhhdmUgbWlzbWF0Y2hpbmcgb2YgcmVhbCB2YWx1ZXMgc2lnbnNcbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zLmNhc2hQb3NpdGlvbiAtIE1hdGguYWJzKGRlcHJlY2lhdGlvbnMuY2xhaW1BbW91bnQpO1xuICB9XG5cbiAgZ2V0VGF4UG9zaXRpb24kKFxuICAgIHRyYW5zYWN0aW9ucyQ6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25Db2xsZWN0aW9uPixcbiAgICBkZXByZWNpYXRpb25zJDogT2JzZXJ2YWJsZTxEZXByZWNpYXRpb25Db2xsZWN0aW9uPlxuICApOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRyYW5zYWN0aW9ucyQsXG4gICAgICBkZXByZWNpYXRpb25zJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0cmFuc2FjdGlvbnMsIGRlcHJlY2lhdGlvbnNdOiBbVHJhbnNhY3Rpb25Db2xsZWN0aW9uLCBEZXByZWNpYXRpb25Db2xsZWN0aW9uXSk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRheFBvc2l0aW9uKHRyYW5zYWN0aW9ucywgZGVwcmVjaWF0aW9ucyk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB0YXhQb3NpdGlvbkdyb3d0aChwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25Db2xsZWN0aW9uLCBkZXByZWNpYXRpb25zOiBEZXByZWNpYXRpb25Db2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCBmb3JlY2FzdGVkVGF4UG9zaXRpb246IG51bWJlciA9IHByb3BlcnRpZXMuc3VtQnkoJ2ZvcmVjYXN0ZWRUYXhQb3NpdGlvbicpO1xuICAgIC8vIGNoZWNrIGlmIGZvcmVjYXN0ZWRUYXhQb3NpdGlvbiA9IDAgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVyb1xuICAgIGlmICghZm9yZWNhc3RlZFRheFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMuZ2V0VGF4UG9zaXRpb24odHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zKSAtIGZvcmVjYXN0ZWRUYXhQb3NpdGlvbikgLyBmb3JlY2FzdGVkVGF4UG9zaXRpb247XG4gIH1cblxuICB0YXhQb3NpdGlvbkdyb3d0aCQoXG4gICAgcHJvcGVydGllcyQ6IE9ic2VydmFibGU8UHJvcGVydHlDb2xsZWN0aW9uPixcbiAgICB0cmFuc2FjdGlvbnMkOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uQ29sbGVjdGlvbj4sXG4gICAgZGVwcmVjaWF0aW9ucyQ6IE9ic2VydmFibGU8RGVwcmVjaWF0aW9uQ29sbGVjdGlvbj5cbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICBwcm9wZXJ0aWVzJCxcbiAgICAgIHRyYW5zYWN0aW9ucyQsXG4gICAgICBkZXByZWNpYXRpb25zJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwcm9wZXJ0aWVzLCB0cmFuc2FjdGlvbnMsIGRlcHJlY2lhdGlvbnNdOiBbUHJvcGVydHlDb2xsZWN0aW9uLCBUcmFuc2FjdGlvbkNvbGxlY3Rpb24sIERlcHJlY2lhdGlvbkNvbGxlY3Rpb25dKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGF4UG9zaXRpb25Hcm93dGgocHJvcGVydGllcywgdHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFJlbnRhbFJldHVybihwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25Db2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zLmNsYWltSW5jb21lIC8gcHJvcGVydGllcy5tYXJrZXRWYWx1ZTtcbiAgfVxuXG4gIGdldExvYW5BbW91bnQocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCBiYW5rQWNjb3VudHM6IEJhbmtBY2NvdW50Q29sbGVjdGlvbiwgbG9hbnM6IExvYW5Db2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcHJvcGVydGllcy5pdGVtcy5yZWR1Y2UoKHRvdGFsQW1vdW50OiBudW1iZXIsIHByb3BlcnR5OiBQcm9wZXJ0eSk6IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gdG90YWxBbW91bnQgKyBiYW5rQWNjb3VudHMuaXRlbXNcbiAgICAgICAgLnJlZHVjZSgocHJvcGVydHlBbW91bnQ6IG51bWJlciwgYmFua0FjY291bnQ6IEJhbmtBY2NvdW50KTogbnVtYmVyID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvcGVydHlBbW91bnQgKyBiYW5rQWNjb3VudC5nZXRQcm9wZXJ0eVBlcmNlbnRhZ2UocHJvcGVydHkuaWQpICogKGxvYW5zLmdldEJ5QmFua0FjY291bnRJZChiYW5rQWNjb3VudC5pZCk/LmFtb3VudCB8fCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXRMb2FuVmFsdWUocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCBiYW5rQWNjb3VudHM6IEJhbmtBY2NvdW50Q29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIHByb3BlcnRpZXMuaXRlbXMucmVkdWNlKCh0b3RhbEFtb3VudDogbnVtYmVyLCBwcm9wZXJ0eTogUHJvcGVydHkpOiBudW1iZXIgPT4ge1xuICAgICAgcmV0dXJuIHRvdGFsQW1vdW50ICsgYmFua0FjY291bnRzLml0ZW1zXG4gICAgICAgIC5yZWR1Y2UoKHByb3BlcnR5QW1vdW50OiBudW1iZXIsIGJhbmtBY2NvdW50OiBCYW5rQWNjb3VudCk6IG51bWJlciA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb3BlcnR5QW1vdW50ICsgYmFua0FjY291bnQuZ2V0UHJvcGVydHlCYWxhbmNlQW1vdW50KHByb3BlcnR5LmlkKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogTFZSXG4gICAqL1xuXG4gIGdldEx2cihwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIGJhbmtBY2NvdW50czogQmFua0FjY291bnRDb2xsZWN0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBNYXRoIGFicyBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBwZXJjZW50YWdlIGNhbGN1bGF0aW9uXG4gICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0TG9hblZhbHVlKHByb3BlcnRpZXMsIGJhbmtBY2NvdW50cykpIC8gcHJvcGVydGllcy5tYXJrZXRWYWx1ZTtcbiAgfVxuXG4gIGdldEx2ciQoXG4gICAgcHJvcGVydGllcyQ6IE9ic2VydmFibGU8UHJvcGVydHlDb2xsZWN0aW9uPixcbiAgICBiYW5rQWNjb3VudHMkOiBPYnNlcnZhYmxlPEJhbmtBY2NvdW50Q29sbGVjdGlvbj5cbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICBwcm9wZXJ0aWVzJCxcbiAgICAgIGJhbmtBY2NvdW50cyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcHJvcGVydGllcywgYmFua0FjY291bnRzXTogW1Byb3BlcnR5Q29sbGVjdGlvbiwgQmFua0FjY291bnRDb2xsZWN0aW9uXSk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEx2cihwcm9wZXJ0aWVzLCBiYW5rQWNjb3VudHMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0THZyQ29tbWVuY2VtZW50KHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgbG9hbnM6IExvYW5Db2xsZWN0aW9uLCBiYW5rQWNjb3VudHM6IEJhbmtBY2NvdW50Q29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgLy8gTWF0aCBhYnMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgcGVyY2VudGFnZSBjYWxjdWxhdGlvblxuICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmdldExvYW5BbW91bnQocHJvcGVydGllcywgYmFua0FjY291bnRzLCBsb2FucykpIC8gcHJvcGVydGllcy5wdXJjaGFzZVByaWNlO1xuICB9XG5cbiAgZ2V0THZyQ29tbWVuY2VtZW50JChcbiAgICBwcm9wZXJ0aWVzJDogT2JzZXJ2YWJsZTxQcm9wZXJ0eUNvbGxlY3Rpb24+LFxuICAgIGJhbmtBY2NvdW50cyQ6IE9ic2VydmFibGU8QmFua0FjY291bnRDb2xsZWN0aW9uPixcbiAgICBsb2FucyQ6IE9ic2VydmFibGU8TG9hbkNvbGxlY3Rpb24+XG4gICk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgcHJvcGVydGllcyQsXG4gICAgICBiYW5rQWNjb3VudHMkLFxuICAgICAgbG9hbnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3Byb3BlcnRpZXMsIGJhbmtBY2NvdW50cywgbG9hbnNdOiBbUHJvcGVydHlDb2xsZWN0aW9uLCBCYW5rQWNjb3VudENvbGxlY3Rpb24sIExvYW5Db2xsZWN0aW9uXSk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEx2ckNvbW1lbmNlbWVudChwcm9wZXJ0aWVzLCBsb2FucywgYmFua0FjY291bnRzKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEx2ckdyb3d0aChwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIGJhbmtBY2NvdW50czogQmFua0FjY291bnRDb2xsZWN0aW9uLCBsb2FuczogTG9hbkNvbGxlY3Rpb24pOiBudW1iZXIge1xuICAgIGNvbnN0IGx2cjogbnVtYmVyID0gdGhpcy5nZXRMdnIocHJvcGVydGllcywgYmFua0FjY291bnRzKTtcbiAgICBjb25zdCBsdnJDb21tZW5jZW1lbnQ6IG51bWJlciA9IHRoaXMuZ2V0THZyQ29tbWVuY2VtZW50KHByb3BlcnRpZXMsIGxvYW5zLCBiYW5rQWNjb3VudHMpO1xuICAgIGlmICghbHZyQ29tbWVuY2VtZW50KSB7XG4gICAgICAvLyBjaGVjayBpZiBsdnJDb21tZW5jZW1lbnQgPSAwIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm9cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5nZXRMdnIocHJvcGVydGllcywgYmFua0FjY291bnRzKSAtIGx2ckNvbW1lbmNlbWVudCkgLyBsdnJDb21tZW5jZW1lbnQ7XG4gIH1cblxuICBnZXRMdnJHcm93dGgkKFxuICAgIHByb3BlcnRpZXMkOiBPYnNlcnZhYmxlPFByb3BlcnR5Q29sbGVjdGlvbj4sXG4gICAgYmFua0FjY291bnRzJDogT2JzZXJ2YWJsZTxCYW5rQWNjb3VudENvbGxlY3Rpb24+LFxuICAgIGxvYW5zJDogT2JzZXJ2YWJsZTxMb2FuQ29sbGVjdGlvbj5cbiAgKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICBwcm9wZXJ0aWVzJCxcbiAgICAgIGJhbmtBY2NvdW50cyQsXG4gICAgICBsb2FucyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcHJvcGVydGllcywgYmFua0FjY291bnRzLCBsb2Fuc106IFtQcm9wZXJ0eUNvbGxlY3Rpb24sIEJhbmtBY2NvdW50Q29sbGVjdGlvbiwgTG9hbkNvbGxlY3Rpb25dKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0THZyR3Jvd3RoKHByb3BlcnRpZXMsIGJhbmtBY2NvdW50cywgbG9hbnMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVxdWl0eSBwb3NpdGlvbiA9IE1hcmtldCB2YWx1ZSAtIGN1cnJlbnQgbG9hbiB2YWx1ZVxuICAgKi9cbiAgZ2V0RXF1aXR5UG9zaXRpb24ocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCBiYW5rQWNjb3VudHM6IEJhbmtBY2NvdW50Q29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgLy8gTWF0aCBhYnMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgcGVyY2VudGFnZSBjYWxjdWxhdGlvblxuICAgIHJldHVybiBwcm9wZXJ0aWVzLm1hcmtldFZhbHVlIC0gTWF0aC5hYnModGhpcy5nZXRMb2FuVmFsdWUocHJvcGVydGllcywgYmFua0FjY291bnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogUHVyY2hhc2UgRXF1aXR5ID0gUHVyY2hhc2UgcHJpY2UgLSBpbml0aWFsIGxvYW4gdmFsdWVcbiAgICovXG4gIGdldFB1cmNoYXNlRXF1aXR5KHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgYmFua0FjY291bnRzOiBCYW5rQWNjb3VudENvbGxlY3Rpb24sIGxvYW5zOiBMb2FuQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgLy8gTWF0aCBhYnMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgcGVyY2VudGFnZSBjYWxjdWxhdGlvblxuICAgIHJldHVybiBwcm9wZXJ0aWVzLnB1cmNoYXNlUHJpY2UgLSBNYXRoLmFicyh0aGlzLmdldExvYW5BbW91bnQocHJvcGVydGllcywgYmFua0FjY291bnRzLCBsb2FucykpO1xuICB9XG5cbiAgZ2V0RXF1aXR5R3Jvd3RoKHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgYmFua0FjY291bnRzOiBCYW5rQWNjb3VudENvbGxlY3Rpb24sIGxvYW5zOiBMb2FuQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgY29uc3QgcHVyY2hhc2VFcXVpdHk6IG51bWJlciA9IHRoaXMuZ2V0UHVyY2hhc2VFcXVpdHkocHJvcGVydGllcywgYmFua0FjY291bnRzLCBsb2Fucyk7XG4gICAgLy8gY2hlY2sgaWYgcHVyY2hhc2VFcXVpdHkgPSAwIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm9cbiAgICBpZiAoIXB1cmNoYXNlRXF1aXR5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMuZ2V0RXF1aXR5UG9zaXRpb24ocHJvcGVydGllcywgYmFua0FjY291bnRzKSAtIHB1cmNoYXNlRXF1aXR5KSAvIHB1cmNoYXNlRXF1aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkaWN0aW9uYXJ5IG9mIGJhZGdlcyBmb3IgZWFjaCBwcm9wZXJ0eSBpbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRCYWRnZXNCeVByb3BlcnR5KHByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiwgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb24sIGRlcHJlY2lhdGlvbnM6IERlcHJlY2lhdGlvbkNvbGxlY3Rpb24pOiBEaWN0aW9uYXJ5PEJhZGdlPiB7XG4gICAgY29uc3QgYmFkZ2VzQnlQcm9wZXJ0eSA9IG5ldyBEaWN0aW9uYXJ5KFtdKTtcblxuICAgIHByb3BlcnRpZXMudG9BcnJheSgpLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuICAgICAgYmFkZ2VzQnlQcm9wZXJ0eS5hZGQocHJvcGVydHkuaWQsIHRoaXMuZ2V0QmFkZ2UocHJvcGVydHksIHByb3BlcnRpZXMsIHRyYW5zYWN0aW9ucywgZGVwcmVjaWF0aW9ucykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJhZGdlc0J5UHJvcGVydHk7XG4gIH1cblxuICBnZXRDYXNoUG9zaXRpb25Hcm93dGgocHJvcGVydGllczogUHJvcGVydHlDb2xsZWN0aW9uLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uQ29sbGVjdGlvbik6IG51bWJlciB7XG4gICAgY29uc3QgZm9yZWNhc3RlZENhc2hQb3NpdGlvbjogbnVtYmVyID0gcHJvcGVydGllcy5zdW1CeSgnZm9yZWNhc3RlZENhc2hQb3NpdGlvbicpO1xuXG4gICAgLy8gY2hlY2sgaWYgZm9yZWNhc3RlZENhc2hQb3NpdGlvbiA9IDAgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVyb1xuICAgIGlmICghZm9yZWNhc3RlZENhc2hQb3NpdGlvbikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0cmFuc2FjdGlvbnMuY2FzaFBvc2l0aW9uIC0gZm9yZWNhc3RlZENhc2hQb3NpdGlvbikgLyBmb3JlY2FzdGVkQ2FzaFBvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBCYWRnZSBmb3Igc2luZ2xlIHByb3BlcnR5IGluIGNvbGxlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0QmFkZ2UocHJvcGVydHk6IFByb3BlcnR5LCBwcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24sIHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25Db2xsZWN0aW9uLCBkZXByZWNpYXRpb25zOiBEZXByZWNpYXRpb25Db2xsZWN0aW9uKTogQmFkZ2Uge1xuICAgIC8vIGJlc3QgcGVyZm9ybWFuY2UgcHJvcGVydGllcyBjb3VsZCBiZSBvbmx5IGZyb20gYWN0aXZlIHByb3BlcnRpZXMgbGlzdFxuICAgIGNvbnN0IGFjdGl2ZVByb3BlcnRpZXM6IFByb3BlcnR5Q29sbGVjdGlvbiA9IHByb3BlcnRpZXMuZ2V0QWN0aXZlUHJvcGVydGllcygpO1xuICAgIGNvbnN0IGJlc3RQZXJmb3JtYW5jZUdyb3d0aFByb3BlcnR5OiBQcm9wZXJ0eSA9IGFjdGl2ZVByb3BlcnRpZXMuZ2V0QmVzdFBlcmZvcm1hbmNlR3Jvd3RoUHJvcGVydHkoKTtcbiAgICBjb25zdCBiZXN0UGVyZm9ybWFuY2VUYXhQcm9wZXJ0eTogUHJvcGVydHkgPSBhY3RpdmVQcm9wZXJ0aWVzLmdldEJlc3RQZXJmb3JtYW5jZVRheFByb3BlcnR5KFxuICAgICAgdHJhbnNhY3Rpb25zLCBkZXByZWNpYXRpb25zXG4gICAgKTtcblxuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSAhcHJvcGVydHkuaXNBY3RpdmU6XG4gICAgICAgIHJldHVybiBuZXcgQmFkZ2UoJ0luYWN0aXZlJywgQmFkZ2VDb2xvckVudW0uR1JBWSk7XG4gICAgICBjYXNlIHByb3BlcnR5LmlkID09PSBiZXN0UGVyZm9ybWFuY2VUYXhQcm9wZXJ0eS5pZCAmJiBwcm9wZXJ0eS5pZCA9PT0gYmVzdFBlcmZvcm1hbmNlR3Jvd3RoUHJvcGVydHkuaWQ6XG4gICAgICAgIHJldHVybiBuZXcgQmFkZ2UoJ0Jlc3QgcGVyZm9ybWFuY2UgZ3Jvd3RoICYgdGF4JywgQmFkZ2VDb2xvckVudW0uR09MRCk7XG4gICAgICBjYXNlIHByb3BlcnR5LmlkID09PSBiZXN0UGVyZm9ybWFuY2VUYXhQcm9wZXJ0eS5pZDpcbiAgICAgICAgcmV0dXJuIG5ldyBCYWRnZSgnQmVzdCBwZXJmb3JtYW5jZSB0YXgnLCBCYWRnZUNvbG9yRW51bS5HT0xEKTtcbiAgICAgIGNhc2UgcHJvcGVydHkuaWQgPT09IGJlc3RQZXJmb3JtYW5jZUdyb3d0aFByb3BlcnR5LmlkOlxuICAgICAgICByZXR1cm4gbmV3IEJhZGdlKCdCZXN0IHBlcmZvcm1hbmNlIGdyb3d0aCcsIEJhZGdlQ29sb3JFbnVtLkdSRUVOKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgQmFkZ2UoJ01vbml0b3JpbmcgcGVyZm9ybWFuY2UnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==