tnx-shared 5.3.251 → 5.3.253

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.
@@ -220,6 +220,10 @@ export class TemplateInstanceService extends BaseService {
220
220
  const api = `${this.serviceUri}/LatexToBase64`;
221
221
  return this._httpClient.post(api, { laTex, font }).toPromise();
222
222
  }
223
+ laTexToImage(laTex, font = 54) {
224
+ const api = `${this.serviceUri}/LatexToImage`;
225
+ return this._httpClient.post(api, { laTex, font }, { responseType: 'blob' }).toPromise();
226
+ }
223
227
  _export(model) {
224
228
  return __awaiter(this, void 0, void 0, function* () {
225
229
  const url = `${this.serviceUri}/export`;
@@ -353,4 +357,4 @@ TemplateInstanceService.ctorParameters = () => [
353
357
  { type: DownloadLinkService },
354
358
  { type: Injector }
355
359
  ];
356
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVpbnN0YW5jZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG54LXNoYXJlZC9zcmMvbGliL3NlcnZpY2VzL3RlbXBsYXRlaW5zdGFuY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBTWpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFLL0MsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFdBQVc7SUFPcEQsWUFDSSxvQkFBeUMsRUFDakMsV0FBdUIsRUFDdkIsYUFBMkIsRUFDekIsWUFBaUMsRUFDakMsZ0JBQWlDLEVBQ2pDLFlBQXlCLEVBQ3pCLGNBQTZCLEVBQy9CLG9CQUF5QyxFQUNqRCxRQUFrQjtRQUVsQixLQUFLLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMscUJBQXFCLElBQUksb0JBQW9CLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsbUJBQW1CLENBQUMsQ0FBQztRQVRwTCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUN6QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyxpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN6QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUMvQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBSWpELElBQUksQ0FBQyxhQUFhLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQVUsbUJBQW1CLENBQUM7SUFDbkosQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGtCQUFrQixXQUFXLENBQUM7SUFDaEcsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxxRUFBcUU7SUFDckUsaUdBQWlHO0lBRWpHOzs7T0FHRztJQUNILG1CQUFtQixDQUFDLEtBQWtCO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsc0JBQXNCLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ2xCLElBQUksQ0FBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQWdCLEVBQUUsQ0FBQzthQUN6RCxTQUFTLEVBQUU7YUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQU0sR0FBRyxFQUFDLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFrQjtRQUMxQixLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQUMsS0FBc0I7UUFDMUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSwwQkFBMEIsQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVCLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDbEIsSUFBSSxDQUFpQixHQUFHLEVBQUUsS0FBSyxDQUFDO2FBQ2hDLFNBQVMsRUFBRTthQUNYLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNSLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZEO2lCQUNJO2dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDL0M7UUFDTCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBTSxHQUFHLEVBQUMsRUFBRTtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsZUFBZSxDQUFDLFNBQTBCO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPO1NBQ1Y7UUFFRCxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakgsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsZUFBZTtRQUNsRSxPQUFPLEdBQUcsUUFBUSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBaUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxnQkFBZ0IsQ0FBQztRQUUvQyxPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ2xCLElBQUksQ0FBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQWdCLEVBQUUsQ0FBQzthQUN6RCxTQUFTLEVBQUU7YUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1RSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBTSxHQUFHLEVBQUMsRUFBRTtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsaUdBQWlHO0lBQ2pHLGlFQUFpRTtJQUNqRSxpR0FBaUc7SUFFakc7Ozs7Ozs7O09BUUc7SUFDRyw4QkFBOEIsQ0FBQyxLQUFrQjs7WUFDbkQsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxpQ0FBaUMsQ0FBQztZQUVoRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFpQixHQUFHLEVBQUUsS0FBSyxDQUFDO2lCQUNuRCxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFRDs7O09BR0c7SUFDRywwQkFBMEIsQ0FBQyxLQUFrQjs7WUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxzQkFBc0IsQ0FBQztZQUVyRCxPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNsQixJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFnQixFQUFFLENBQUM7aUJBQ3BELFNBQVMsRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FBQTtJQUVEOzs7T0FHRztJQUNHLG9CQUFvQixDQUFDLEtBQWlDOztZQUN4RCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLGdCQUFnQixDQUFDO1lBRS9DLE9BQU8sSUFBSSxDQUFDLFdBQVc7aUJBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQWdCLEVBQUUsQ0FBQztpQkFDcEQsU0FBUyxFQUFFLENBQUM7UUFDckIsQ0FBQztLQUFBO0lBQ0Q7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLFlBQW9CLEVBQUUsSUFBUztRQUN2RCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLDJCQUEyQixZQUFZLGVBQWUsQ0FBQztRQUVyRixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ2xCLElBQUksQ0FBaUIsR0FBRyxFQUFFLElBQUksQ0FBQzthQUMvQixTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO2dCQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxZQUFvQixFQUFFLElBQVMsRUFBRSxPQUFlLFFBQVE7UUFDdkUsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSwyQkFBMkIsWUFBWSxnQkFBZ0IsQ0FBQztRQUV0RixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ2xCLElBQUksQ0FBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQWdCLEVBQUUsQ0FBQzthQUN4RCxTQUFTLEVBQUU7YUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBTSxHQUFHLEVBQUMsRUFBRTtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsOEJBQThCLENBQUMsWUFBb0IsRUFBRSxJQUFTLEVBQUUsT0FBZSxRQUFRO1FBQ25GLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsMkJBQTJCLFlBQVksZUFBZSxDQUFDO1FBRXJGLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDbEIsSUFBSSxDQUFNLEdBQUcsRUFBRSxJQUFJLENBQUM7YUFDcEIsU0FBUyxFQUFFO2FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDekQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQU0sR0FBRyxFQUFDLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRztRQUNoRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDdEUsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxnQkFBZ0IsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFpQixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBR0ssT0FBTyxDQUFDLEtBQWlCOztZQUMzQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLFNBQVMsQ0FBQztZQUV4QyxPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNsQixJQUFJLENBQWlCLEdBQUcsRUFBRSxLQUFLLENBQUM7aUJBQ2hDLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FBQTtJQUVEOzs7T0FHRztJQUNHLE1BQU0sQ0FBQyxLQUFpQjs7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7aUJBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNQLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUM7aUJBQ25FO3FCQUNJO29CQUNELElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzlDO1lBQ0wsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQztLQUFBO0lBRUssYUFBYSxDQUFDLEtBQWlCOztZQUNqQyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLGVBQWUsQ0FBQztZQUU5QyxPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNsQixJQUFJLENBQWlCLEdBQUcsRUFBRSxLQUFLLENBQUM7aUJBQ2hDLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FBQTtJQUVEOzs7O09BSUc7SUFDRyxZQUFZLENBQUMsSUFBZ0IsRUFBRSxZQUFZLEdBQUcsS0FBSzs7WUFDckQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztpQkFDMUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNQLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFDWixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBa0IsQ0FBQztvQkFDdkMsSUFBSSxZQUFZLEVBQUU7d0JBQ2QsT0FBTzs0QkFDSCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07NEJBQ3ZCLGFBQWEsRUFBRSxLQUFLOzRCQUNwQixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7eUJBQzFCLENBQUM7cUJBQ0w7b0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLHVCQUF1QixDQUFDO3dCQUMvRCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07d0JBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtxQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ1A7cUJBQ0k7b0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDOUM7WUFDTCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsaURBQWlELENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pFLE9BQVksUUFBUSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQztLQUFBO0lBR0ssaUJBQWlCLENBQUMsS0FBaUI7O1lBQ3JDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsbUJBQW1CLENBQUM7WUFFbEQsT0FBTyxJQUFJLENBQUMsV0FBVztpQkFDbEIsSUFBSSxDQUFpQixHQUFHLEVBQUUsS0FBSyxDQUFDO2lCQUNoQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0csZ0JBQWdCLENBQUMsSUFBZ0IsRUFBRSxZQUFZLEdBQUcsS0FBSzs7WUFDekQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO2lCQUM5QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO29CQUNaLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFrQixDQUFDO29CQUN2QyxJQUFJLFlBQVksRUFBRTt3QkFDZCxPQUFPOzRCQUNILE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTs0QkFDdkIsYUFBYSxFQUFFLEtBQUs7NEJBQ3BCLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTt5QkFDMUIsQ0FBQztxQkFDTDtvQkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksdUJBQXVCLENBQUM7d0JBQy9ELE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTt3QkFDdkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO3FCQUM5QixDQUFDLENBQUMsQ0FBQztpQkFDUDtxQkFDSTtvQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM5QztZQUNMLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekUsT0FBWSxRQUFRLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDO0tBQUE7Ozs7WUEzVkosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFOUSxtQkFBbUI7WUFoQm5CLFVBQVU7WUFrQlYsWUFBWTtZQVpaLG1CQUFtQjtZQVduQixlQUFlO1lBRmYsV0FBVztZQURYLGFBQWE7WUFUYixtQkFBbUI7WUFKUCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5cbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWxlLWV4cGxvcmVyL21vZGVscy9nZW5lcmF0ZS1saW5rLWRvd25sb2FkLWR0byc7XG5pbXBvcnQgeyBEb3dubG9hZExpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2Rvd25sb2FkLWxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWxlLWV4cGxvcmVyL3NlcnZpY2VzL2ZpbGUtZXhwbG9yZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNvbnN0YW50IH0gZnJvbSAnLi4vY29uZmlncy9jb21wb25lbnQtY29udGFudHMnO1xuaW1wb3J0IHsgTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlncy9tb2R1bGUtY29uZmlnJztcbmltcG9ydCB7IEV4cG9ydE1hbnlNb2RlbCwgRXhwb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvZXhwb3J0LWZpbGUtaW5mbyc7XG5pbXBvcnQgeyBFeHBvcnRJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2V4cG9ydC1pdGVtJztcbmltcG9ydCB7IEV4cG9ydFdpdGhvdXRUZW1wbGF0ZU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2V4cG9ydC13aXRob3V0LXRlbXBsYXRlJztcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi9jcnVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4vbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4vbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQcmludFNlcnZpY2UgfSBmcm9tICcuL3ByaW50LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlSW5zdGFuY2VTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xuXG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IGFueTtcbiAgICByZWFkb25seSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWc7XG4gICAgLy8gcmVhZG9ubHkgc2VydmljZVVyaTogc3RyaW5nOyAvL1ThuqFtIHRo4budaSBrIMSR4buDIHJlYWRvbmx5IMSR4buDIGPDsyB0aOG7gyBzd2l0Y2ggc2FuZyB2NFxuICAgIHNlcnZpY2VVcmk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSBfcHJpbnRTZXJ2aWNlOiBQcmludFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZmlsZVNlcnZpY2U6IEZpbGVFeHBsb3JlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2Rvd25sb2FkTGlua1NlcnZpY2U6IERvd25sb2FkTGlua1NlcnZpY2UsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2h0dHBDbGllbnQsIGluamVjdG9yLCBgJHtfbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5hcGlEb21haW4uYXV0aG9yaXphdGlvbkVuZHBvaW50fS8ke19tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50LmFwaVZlcnNpb259L1RlbXBsYXRlSW5zdGFuY2VgKTtcbiAgICAgICAgdGhpcy5fbW9kdWxlQ29uZmlnID0gX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuc2VydmljZVVyaSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4udGVtcGxhdGVFbmRwb2ludH0vJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpVmVyc2lvbn0vVGVtcGxhdGVJbnN0YW5jZWA7XG4gICAgfVxuXG4gICAgdXNlVjQoKSB7XG4gICAgICAgIHRoaXMuc2VydmljZVVyaSA9IGAke3RoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC5hcGlEb21haW4udGVtcGxhdGVWNEVuZHBvaW50fS9UZW1wbGF0ZWA7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xuICAgIC8vICAgICAgICAgICAgICAgICAgWFXhuqRUIEVYQ0VMOiBraMO0bmcgZMO5bmcgc2lnbmFsUiwgdOG7sSDEkeG7mW5nIGzGsHUgeHXhu5FuZ1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cblxuICAgIC8qKlxuICAgICAqIFh14bqldCBt4buZdCBmaWxlIHRy4buxYyB0aeG6v3Aga2jDtG5nLCB4b25nIHRow6wgdOG7sSBsxrB1IHh14buRbmcuXG4gICAgICogQHBhcmFtIG1vZGVsXG4gICAgICovXG4gICAgZXhwb3J0Q3hFeGNlbEJ5Q29kZShtb2RlbDogRXhwb3J0TW9kZWwpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9FeHBvcnRDeEV4Y2VsQnlDb2RlYDtcbiAgICAgICAgdGhpcy5zZXRGaWxlSW5mbyhtb2RlbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PGFueT4odXJsLCBtb2RlbCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyBhcyAnanNvbicgfSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBGaWxlU2F2ZXIuc2F2ZUFzKHJlcywgdGhpcy5nZXRGdWxsRmlsZU5hbWUobW9kZWwuZmlsZU5hbWUgfHwgbW9kZWwuY29kZSkpO1xuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBlcnIuZXJyb3IudGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKEpTT04ucGFyc2UoZXJyb3JUZXh0IHx8ICcnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRGaWxlSW5mbyhtb2RlbDogRXhwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgbW9kZWwuZGF0YSA9IG1vZGVsLmRhdGEgPyBtb2RlbC5kYXRhIDogSlNPTi5zdHJpbmdpZnkobW9kZWwuZGF0YU9iamVjdCk7XG4gICAgICAgIGRlbGV0ZSBtb2RlbC5kYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFh14bqldCBuaGnhu4F1IGZpbGUsIHhvbmcgdGjDrCB04buxIMSR4buZbmcgdOG6o2kgduG7gSBmb2xkZXIgxJHDoyBuw6luLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGV4cG9ydE1hbnlDeEV4Y2VsQnlDb2RlKG1vZGVsOiBFeHBvcnRNYW55TW9kZWwpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9FeHBvcnRNYW55Q3hFeGNlbEJ5Q29kZWA7XG4gICAgICAgIHRoaXMuc2V0TWFueUZpbGVJbmZvKG1vZGVsKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHVybCwgbW9kZWwpXG4gICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVTZXJ2aWNlLmRvd25sb2FkRm9sZGVyKHJlcy5kYXRhLmZvbGRlcklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBlcnIuZXJyb3IudGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKEpTT04ucGFyc2UoZXJyb3JUZXh0IHx8ICcnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRNYW55RmlsZUluZm8obWFueU1vZGVsOiBFeHBvcnRNYW55TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFzTW9kZWwgPSBtYW55TW9kZWwgJiYgbWFueU1vZGVsLmxzdEZpbGVJbmZvICYmIG1hbnlNb2RlbC5sc3RGaWxlSW5mby5sZW5ndGg7XG4gICAgICAgIGlmICghaGFzTW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hbnlNb2RlbC5sc3RGaWxlSW5mby5mb3JFYWNoKGZpbGVJbmZvID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZUluZm8oZmlsZUluZm8pO1xuICAgICAgICAgICAgZmlsZUluZm8uZmlsZU5hbWUgPSBgJHtmaWxlSW5mby5maWxlTmFtZX1fJHt0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKX0uJHtUZW1wbGF0ZUNvbnN0YW50LkVYQ0VMX0VYVEVOU0lPTn1gO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRGdWxsRmlsZU5hbWUoZmlsZU5hbWUsIGV4dGVuc2lvbiA9IFRlbXBsYXRlQ29uc3RhbnQuRVhDRUxfRVhURU5TSU9OKSB7XG4gICAgICAgIHJldHVybiBgJHtmaWxlTmFtZX0ke2V4dGVuc2lvbn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFh14bqldCBmaWxlIGV4Y2VsIGtow7RuZyBkw7luZyB0ZW1wbGF0ZSwgdOG7sSDEkeG7mW5nIHThuqNpIHh14buRbmcuXG4gICAgICogQHBhcmFtIG1vZGVsXG4gICAgICovXG4gICAgZXhwb3J0Q3hFeGNlbChtb2RlbDogRXhwb3J0V2l0aG91dFRlbXBsYXRlTW9kZWwpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9FeHBvcnRDeEV4Y2VsYDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8YW55Pih1cmwsIG1vZGVsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIEZpbGVTYXZlci5zYXZlQXMocmVzLCB0aGlzLmdldEZ1bGxGaWxlTmFtZShtb2RlbC5maWxlTmFtZSB8fCAnRXhwb3J0JykpO1xuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBlcnIuZXJyb3IudGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKEpTT04ucGFyc2UoZXJyb3JUZXh0IHx8ICcnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYVeG6pFQgRVhDRUw6IGTDuW5nIGNobyByZXBvcnQgcXVldWVcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHh14bqldCBmaWxlIGV4Y2VsIGTDuW5nIHNpZ25hbFIuXG4gICAgICogLSBEZXNjcmlwdGlvbjogRXhwb3J0IHPhu60gZHVuZyBDbG9zZWRYbWwuUmVwb3J0IChDeCkgduG7m2kgc2lnbmFsUiwgc+G7rSBk4bulbmcgY2hvIGZpbGUgZOG7ryBsaeG7h3UgbOG7m24uXG4gICAgICogLSBQYXJhbTogbW9kZWwgY2jhu6lhXG4gICAgICogICAgICAtIGNvZGUgOiAgY29kZSBj4bunYSB0ZW1wbGF0ZSBj4bqldSBow6xuaCBiw6puIFF14bqjbiB0cuG7iyA+IEJp4buDdSBt4bqrdSA+IEJp4buDdSBt4bqrdSBleGNlbC5cbiAgICAgKiAgICAgIC0gZGF0YSA6IG9iamVjdCBjaOG7qWEgZOG7ryBsaeG7h3UgxJHDoyBjaHV54buBbiB0aMOgbmggZOG6oW5nIGpzb24uXG4gICAgICogICAgICAtIGZpbGVOYW1lOiB0w6puIGZpbGUgc2F1IGtoaSBleHBvcnQuXG4gICAgICogICAgICAtIHRvcGljOiBndWlkIGTDuW5nIMSR4buDIHN1YnNjcmliZS5cbiAgICAgKi9cbiAgICBhc3luYyBFeHBvcnRDeEV4Y2VsQnlDb2RlV2l0aFNpZ25hbFIobW9kZWw6IEV4cG9ydE1vZGVsKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0V4cG9ydEN4RXhjZWxCeUNvZGVXaXRoU2lnbmFsUmA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQucG9zdDxSZXNwb25zZVJlc3VsdD4odXJsLCBtb2RlbClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHh14bqldCBmaWxlIGV4Y2VsIGtow7RuZyBkw7luZyBzaWduYWxSLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGFzeW5jIGV4cG9ydEN4RXhjZWxCeUNvZGVQcm9taXNlKG1vZGVsOiBFeHBvcnRNb2RlbCk6IFByb21pc2U8T2JqZWN0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vRXhwb3J0Q3hFeGNlbEJ5Q29kZWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0KHVybCwgbW9kZWwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nIH0pXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB4deG6pXQgZmlsZSBleGNlbCBraMO0bmcgZMO5bmcgc2lnbmFsUiB2w6Aga2jDtG5nIGTDuW5nIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGFzeW5jIGV4cG9ydEN4RXhjZWxQcm9taXNlKG1vZGVsOiBFeHBvcnRXaXRob3V0VGVtcGxhdGVNb2RlbCk6IFByb21pc2U8T2JqZWN0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vRXhwb3J0Q3hFeGNlbGA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0KHVybCwgbW9kZWwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nIH0pXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdvcmRcbiAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBmaWxsVGVtcGxhdGVCeUNvZGVBbmRHZXRQZGYodGVtcGxhdGVDb2RlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L2ZpbGxXb3JkQnlUZW1wbGF0ZUNvZGUvJHt0ZW1wbGF0ZUNvZGV9P2lzUHJpbnQ9dHJ1ZWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PFJlc3BvbnNlUmVzdWx0Pih1cmwsIGRhdGEpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmludFNlcnZpY2UucHJpbnRCYXNlNjRQZGYocmVzLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdvcmRcbiAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBmaWxsVGVtcGxhdGVCeUNvZGUodGVtcGxhdGVDb2RlOiBzdHJpbmcsIGRhdGE6IGFueSwgbmFtZTogc3RyaW5nID0gJ0V4cG9ydCcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9maWxsV29yZEJ5VGVtcGxhdGVDb2RlLyR7dGVtcGxhdGVDb2RlfT9pc1ByaW50PWZhbHNlYDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8YW55Pih1cmwsIGRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nIH0pXG4gICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhyZXMsIHRoaXMuZ2V0RnVsbEZpbGVOYW1lKG5hbWUgfHwgJ0V4cG9ydCcsIFRlbXBsYXRlQ29uc3RhbnQuV09SRF9FWFRFTlNJT04pKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgZXJyLmVycm9yLnRleHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShKU09OLnBhcnNlKGVycm9yVGV4dCB8fCAnJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbGxUZW1wbGF0ZUJ5Q29kZUFuZEV4cG9ydFBkZih0ZW1wbGF0ZUNvZGU6IHN0cmluZywgZGF0YTogYW55LCBuYW1lOiBzdHJpbmcgPSAnRXhwb3J0Jykge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L2ZpbGxXb3JkQnlUZW1wbGF0ZUNvZGUvJHt0ZW1wbGF0ZUNvZGV9P2lzUHJpbnQ9dHJ1ZWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PGFueT4odXJsLCBkYXRhKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSB0aGlzLmI2NHRvQmxvYihyZXMuZGF0YSwgJ2FwcGxpY2F0aW9uL3BkZicpO1xuICAgICAgICAgICAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgdGhpcy5nZXRGdWxsRmlsZU5hbWUobmFtZSB8fCAnRXhwb3J0JywgJy5wZGYnKSk7XG4gICAgICAgICAgICB9KS5jYXRjaChhc3luYyBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IGVyci5lcnJvci50ZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UoSlNPTi5wYXJzZShlcnJvclRleHQgfHwgJycpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGI2NHRvQmxvYihiNjREYXRhLCBjb250ZW50VHlwZSA9ICcnLCBzbGljZVNpemUgPSA1MTIpIHtcbiAgICAgICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGI2NERhdGEpO1xuICAgICAgICBjb25zdCBieXRlQXJyYXlzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBvZmZzZXQgKz0gc2xpY2VTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBzbGljZSA9IGJ5dGVDaGFyYWN0ZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2xpY2VTaXplKTtcblxuICAgICAgICAgICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcbiAgICAgICAgICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGJ5dGVBcnJheXMsIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG4gICAgICAgIHJldHVybiBibG9iO1xuICAgIH1cblxuICAgIGxhVGV4VG9CYXNlNjRJbWFnZShsYVRleDogc3RyaW5nLCBmb250OiBudW1iZXIgPSA1NCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgYXBpID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9MYXRleFRvQmFzZTY0YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpLCB7IGxhVGV4LCBmb250IH0pLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuXG4gICAgYXN5bmMgX2V4cG9ydChtb2RlbDogRXhwb3J0SXRlbSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9leHBvcnRgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4odXJsLCBtb2RlbClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgYSB0cmVlIG9mIGZvbGRlcnMsIGZpbGVzIHVzaW5nIGJhY2tncm91bmQgam9iLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGFzeW5jIGV4cG9ydChtb2RlbDogRXhwb3J0SXRlbSkge1xuICAgICAgICB0aGlzLl9leHBvcnQobW9kZWwpXG4gICAgICAgICAgICAudGhlbihycyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaMOqbSB4deG6pXQgZmlsZSB0aMOgbmggY8O0bmchJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVGhhbyB0w6FjIGNoxrBhIHRow6BuaCBjw7RuZy4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdSEnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21tb25TZXJ2aWNlLmxvZ0luZm9TaW1wbGUoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIF9leHBvcnROb3JtYWwobW9kZWw6IEV4cG9ydEl0ZW0pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vZXhwb3J0Tm9ybWFsYDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHVybCwgbW9kZWwpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3J0IGEgdHJlZSBvZiBmb2xkZXJzLCBmaWxlcyBkaXJlY3RseS5cbiAgICAgKiBAcGFyYW0gZGF0YSBwYXJhbSDEkeG7gyBnZW4gcmEgZmlsZSBleGNlbFxuICAgICAqIEBwYXJhbSBpc1ZpZXdPbmxpbmUgY8OzIGTDuW5nIGZpbGUgdmlld2VyIMSR4buDIHZpZXcgZmlsZSBvbmxpbmUga2jDtG5nXG4gICAgICovXG4gICAgYXN5bmMgZXhwb3J0Tm9ybWFsKGRhdGE6IEV4cG9ydEl0ZW0sIGlzVmlld09ubGluZSA9IGZhbHNlKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0Tm9ybWFsKGRhdGEpXG4gICAgICAgICAgICAudGhlbihycyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9vdEl0ZW0gPSBycy5kYXRhIGFzIEV4cG9ydEl0ZW07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZpZXdPbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiByb290SXRlbS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWxlVmVyc2lvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHJvb3RJdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25sb2FkTGlua1NlcnZpY2UuZG93bmxvYWRMaW5rKG5ldyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHJvb3RJdGVtLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklkOiByb290SXRlbS5mb2xkZXJJZFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVGhhbyB0w6FjIGNoxrBhIHRow6BuaCBjw7RuZy4gVnVpIGzDsm5nIHRo4butIGzhuqFpIHNhdSEnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21tb25TZXJ2aWNlLmxvZ0luZm9TaW1wbGUoZXJyKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ2V0UmVzcG9uc2VSZXN1bHRGcm9tRXhjZXB0aW9uKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxhbnk+cmVzcG9uc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGFzeW5jIF9leHBvcnRNdWx0aVNoZWV0KG1vZGVsOiBFeHBvcnRJdGVtKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L2V4cG9ydE11bHRpU2hlZXRgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4odXJsLCBtb2RlbClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcuG6oyB24buBIGV4Y2VsIGZpbGUgxJHDoyBnZW4gduG7m2kgdGVtcGxhdGUuXG4gICAgICogQHBhcmFtIGRhdGEgZOG7ryBsaeG7h3UgxJHhuqd1IHbDoG8gxJHhu4MgZ2VuIHRlbXBsYXRlXG4gICAgICogQHBhcmFtIGlzVmlld09ubGluZSBjw7MgZMO5bmcgZmlsZSB2aWV3ZXIgxJHhu4MgdmlldyBmaWxlIG9ubGluZSBraMO0bmdcbiAgICAgKi9cbiAgICBhc3luYyBleHBvcnRNdWx0aVNoZWV0KGRhdGE6IEV4cG9ydEl0ZW0sIGlzVmlld09ubGluZSA9IGZhbHNlKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwb3J0TXVsdGlTaGVldChkYXRhKVxuICAgICAgICAgICAgLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RJdGVtID0gcnMuZGF0YSBhcyBFeHBvcnRJdGVtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWaWV3T25saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogcm9vdEl0ZW0uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlsZVZlcnNpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiByb290SXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmRvd25sb2FkTGluayhuZXcgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiByb290SXRlbS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJZDogcm9vdEl0ZW0uZm9sZGVySWRcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RoYW8gdMOhYyBjaMawYSB0aMOgbmggY8O0bmcuIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXUhJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZS5sb2dJbmZvU2ltcGxlKGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmdldFJlc3BvbnNlUmVzdWx0RnJvbUV4Y2VwdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiA8YW55PnJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVpbnN0YW5jZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG54LXNoYXJlZC9zcmMvbGliL3NlcnZpY2VzL3RlbXBsYXRlaW5zdGFuY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBTWpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFLL0MsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFdBQVc7SUFPcEQsWUFDSSxvQkFBeUMsRUFDakMsV0FBdUIsRUFDdkIsYUFBMkIsRUFDekIsWUFBaUMsRUFDakMsZ0JBQWlDLEVBQ2pDLFlBQXlCLEVBQ3pCLGNBQTZCLEVBQy9CLG9CQUF5QyxFQUNq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QyxFQUFFLENBQUMsQ0FBQztpQkFDOUM7WUFDTCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsaURBQWlELENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pFLE9BQVksUUFBUSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQztLQUFBOzs7O1lBaFdKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBTlEsbUJBQW1CO1lBaEJuQixVQUFVO1lBa0JWLFlBQVk7WUFaWixtQkFBbUI7WUFXbkIsZUFBZTtZQUZmLFdBQVc7WUFEWCxhQUFhO1lBVGIsbUJBQW1CO1lBSlAsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG5pbXBvcnQgeyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9tb2RlbHMvZ2VuZXJhdGUtbGluay1kb3dubG9hZC1kdG8nO1xuaW1wb3J0IHsgRG93bmxvYWRMaW5rU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9kb3dubG9hZC1saW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZUV4cGxvcmVyU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVDb25zdGFudCB9IGZyb20gJy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRhbnRzJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZ3MvbW9kdWxlLWNvbmZpZyc7XG5pbXBvcnQgeyBFeHBvcnRNYW55TW9kZWwsIEV4cG9ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2V4cG9ydC1maWxlLWluZm8nO1xuaW1wb3J0IHsgRXhwb3J0SXRlbSB9IGZyb20gJy4uL21vZGVscy9leHBvcnQtaXRlbSc7XG5pbXBvcnQgeyBFeHBvcnRXaXRob3V0VGVtcGxhdGVNb2RlbCB9IGZyb20gJy4uL21vZGVscy9leHBvcnQtd2l0aG91dC10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBSZXNwb25zZVJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS1yZXN1bHQnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tICcuL2Jhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL21vZHVsZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuL25vdGlmaWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJpbnRTZXJ2aWNlIH0gZnJvbSAnLi9wcmludC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlIHtcblxuICAgIHJlYWRvbmx5IGVudmlyb25tZW50OiBhbnk7XG4gICAgcmVhZG9ubHkgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnO1xuICAgIC8vIHJlYWRvbmx5IHNlcnZpY2VVcmk6IHN0cmluZzsgLy9U4bqhbSB0aOG7nWkgayDEkeG7gyByZWFkb25seSDEkeG7gyBjw7MgdGjhu4Mgc3dpdGNoIHNhbmcgdjRcbiAgICBzZXJ2aWNlVXJpOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgX21vZHVsZUNvbmZpZ1NlcnZpY2U6IE1vZHVsZUNvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgIHByaXZhdGUgX3ByaW50U2VydmljZTogUHJpbnRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2ZpbGVTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9kb3dubG9hZExpbmtTZXJ2aWNlOiBEb3dubG9hZExpbmtTZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9odHRwQ2xpZW50LCBpbmplY3RvciwgYCR7X21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuYXBpRG9tYWluLmF1dGhvcml6YXRpb25FbmRwb2ludH0vJHtfbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS9UZW1wbGF0ZUluc3RhbmNlYCk7XG4gICAgICAgIHRoaXMuX21vZHVsZUNvbmZpZyA9IF9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50O1xuICAgICAgICB0aGlzLnNlcnZpY2VVcmkgPSBgJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLnRlbXBsYXRlRW5kcG9pbnR9LyR7dGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaVZlcnNpb259L1RlbXBsYXRlSW5zdGFuY2VgO1xuICAgIH1cblxuICAgIHVzZVY0KCkge1xuICAgICAgICB0aGlzLnNlcnZpY2VVcmkgPSBgJHt0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBpRG9tYWluLnRlbXBsYXRlVjRFbmRwb2ludH0vVGVtcGxhdGVgO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cbiAgICAvLyAgICAgICAgICAgICAgICAgIFhV4bqkVCBFWENFTDoga2jDtG5nIGTDuW5nIHNpZ25hbFIsIHThu7EgxJHhu5luZyBsxrB1IHh14buRbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG5cbiAgICAvKipcbiAgICAgKiBYdeG6pXQgbeG7mXQgZmlsZSB0cuG7sWMgdGnhur9wIGtow7RuZywgeG9uZyB0aMOsIHThu7EgbMawdSB4deG7kW5nLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGV4cG9ydEN4RXhjZWxCeUNvZGUobW9kZWw6IEV4cG9ydE1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vRXhwb3J0Q3hFeGNlbEJ5Q29kZWA7XG4gICAgICAgIHRoaXMuc2V0RmlsZUluZm8obW9kZWwpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdDxhbnk+KHVybCwgbW9kZWwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nIH0pXG4gICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhyZXMsIHRoaXMuZ2V0RnVsbEZpbGVOYW1lKG1vZGVsLmZpbGVOYW1lIHx8IG1vZGVsLmNvZGUpKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgZXJyLmVycm9yLnRleHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShKU09OLnBhcnNlKGVycm9yVGV4dCB8fCAnJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RmlsZUluZm8obW9kZWw6IEV4cG9ydE1vZGVsKTogdm9pZCB7XG4gICAgICAgIG1vZGVsLmRhdGEgPSBtb2RlbC5kYXRhID8gbW9kZWwuZGF0YSA6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmRhdGFPYmplY3QpO1xuICAgICAgICBkZWxldGUgbW9kZWwuZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBYdeG6pXQgbmhp4buBdSBmaWxlLCB4b25nIHRow6wgdOG7sSDEkeG7mW5nIHThuqNpIHbhu4EgZm9sZGVyIMSRw6MgbsOpbi5cbiAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgKi9cbiAgICBleHBvcnRNYW55Q3hFeGNlbEJ5Q29kZShtb2RlbDogRXhwb3J0TWFueU1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vRXhwb3J0TWFueUN4RXhjZWxCeUNvZGVgO1xuICAgICAgICB0aGlzLnNldE1hbnlGaWxlSW5mbyhtb2RlbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PFJlc3BvbnNlUmVzdWx0Pih1cmwsIG1vZGVsKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWxlU2VydmljZS5kb3dubG9hZEZvbGRlcihyZXMuZGF0YS5mb2xkZXJJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgZXJyLmVycm9yLnRleHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShKU09OLnBhcnNlKGVycm9yVGV4dCB8fCAnJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0TWFueUZpbGVJbmZvKG1hbnlNb2RlbDogRXhwb3J0TWFueU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhc01vZGVsID0gbWFueU1vZGVsICYmIG1hbnlNb2RlbC5sc3RGaWxlSW5mbyAmJiBtYW55TW9kZWwubHN0RmlsZUluZm8ubGVuZ3RoO1xuICAgICAgICBpZiAoIWhhc01vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtYW55TW9kZWwubHN0RmlsZUluZm8uZm9yRWFjaChmaWxlSW5mbyA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEZpbGVJbmZvKGZpbGVJbmZvKTtcbiAgICAgICAgICAgIGZpbGVJbmZvLmZpbGVOYW1lID0gYCR7ZmlsZUluZm8uZmlsZU5hbWV9XyR7dGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCl9LiR7VGVtcGxhdGVDb25zdGFudC5FWENFTF9FWFRFTlNJT059YDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RnVsbEZpbGVOYW1lKGZpbGVOYW1lLCBleHRlbnNpb24gPSBUZW1wbGF0ZUNvbnN0YW50LkVYQ0VMX0VYVEVOU0lPTikge1xuICAgICAgICByZXR1cm4gYCR7ZmlsZU5hbWV9JHtleHRlbnNpb259YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBYdeG6pXQgZmlsZSBleGNlbCBraMO0bmcgZMO5bmcgdGVtcGxhdGUsIHThu7EgxJHhu5luZyB04bqjaSB4deG7kW5nLlxuICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAqL1xuICAgIGV4cG9ydEN4RXhjZWwobW9kZWw6IEV4cG9ydFdpdGhvdXRUZW1wbGF0ZU1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vRXhwb3J0Q3hFeGNlbGA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PGFueT4odXJsLCBtb2RlbCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyBhcyAnanNvbicgfSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBGaWxlU2F2ZXIuc2F2ZUFzKHJlcywgdGhpcy5nZXRGdWxsRmlsZU5hbWUobW9kZWwuZmlsZU5hbWUgfHwgJ0V4cG9ydCcpKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgZXJyLmVycm9yLnRleHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcnVkU2VydmljZS5wcm9jZXNzRXJyb3JSZXNwb25zZShKU09OLnBhcnNlKGVycm9yVGV4dCB8fCAnJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFXhuqRUIEVYQ0VMOiBkw7luZyBjaG8gcmVwb3J0IHF1ZXVlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB4deG6pXQgZmlsZSBleGNlbCBkw7luZyBzaWduYWxSLlxuICAgICAqIC0gRGVzY3JpcHRpb246IEV4cG9ydCBz4butIGR1bmcgQ2xvc2VkWG1sLlJlcG9ydCAoQ3gpIHbhu5tpIHNpZ25hbFIsIHPhu60gZOG7pW5nIGNobyBmaWxlIGThu68gbGnhu4d1IGzhu5tuLlxuICAgICAqIC0gUGFyYW06IG1vZGVsIGNo4bupYVxuICAgICAqICAgICAgLSBjb2RlIDogIGNvZGUgY+G7p2EgdGVtcGxhdGUgY+G6pXUgaMOsbmggYsOqbiBRdeG6o24gdHLhu4sgPiBCaeG7g3UgbeG6q3UgPiBCaeG7g3UgbeG6q3UgZXhjZWwuXG4gICAgICogICAgICAtIGRhdGEgOiBvYmplY3QgY2jhu6lhIGThu68gbGnhu4d1IMSRw6MgY2h1eeG7gW4gdGjDoG5oIGThuqFuZyBqc29uLlxuICAgICAqICAgICAgLSBmaWxlTmFtZTogdMOqbiBmaWxlIHNhdSBraGkgZXhwb3J0LlxuICAgICAqICAgICAgLSB0b3BpYzogZ3VpZCBkw7luZyDEkeG7gyBzdWJzY3JpYmUuXG4gICAgICovXG4gICAgYXN5bmMgRXhwb3J0Q3hFeGNlbEJ5Q29kZVdpdGhTaWduYWxSKG1vZGVsOiBFeHBvcnRNb2RlbCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9FeHBvcnRDeEV4Y2VsQnlDb2RlV2l0aFNpZ25hbFJgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHVybCwgbW9kZWwpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB4deG6pXQgZmlsZSBleGNlbCBraMO0bmcgZMO5bmcgc2lnbmFsUi5cbiAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgKi9cbiAgICBhc3luYyBleHBvcnRDeEV4Y2VsQnlDb2RlUHJvbWlzZShtb2RlbDogRXhwb3J0TW9kZWwpOiBQcm9taXNlPE9iamVjdD4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0V4cG9ydEN4RXhjZWxCeUNvZGVgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdCh1cmwsIG1vZGVsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgeHXhuqV0IGZpbGUgZXhjZWwga2jDtG5nIGTDuW5nIHNpZ25hbFIgdsOgIGtow7RuZyBkw7luZyB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgKi9cbiAgICBhc3luYyBleHBvcnRDeEV4Y2VsUHJvbWlzZShtb2RlbDogRXhwb3J0V2l0aG91dFRlbXBsYXRlTW9kZWwpOiBQcm9taXNlPE9iamVjdD4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0V4cG9ydEN4RXhjZWxgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdCh1cmwsIG1vZGVsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXb3JkXG4gICAgICogQHBhcmFtIHRlbXBsYXRlQ29kZVxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgZmlsbFRlbXBsYXRlQnlDb2RlQW5kR2V0UGRmKHRlbXBsYXRlQ29kZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9maWxsV29yZEJ5VGVtcGxhdGVDb2RlLyR7dGVtcGxhdGVDb2RlfT9pc1ByaW50PXRydWVgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4odXJsLCBkYXRhKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJpbnRTZXJ2aWNlLnByaW50QmFzZTY0UGRmKHJlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXb3JkXG4gICAgICogQHBhcmFtIHRlbXBsYXRlQ29kZVxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgZmlsbFRlbXBsYXRlQnlDb2RlKHRlbXBsYXRlQ29kZTogc3RyaW5nLCBkYXRhOiBhbnksIG5hbWU6IHN0cmluZyA9ICdFeHBvcnQnKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vZmlsbFdvcmRCeVRlbXBsYXRlQ29kZS8ke3RlbXBsYXRlQ29kZX0/aXNQcmludD1mYWxzZWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PGFueT4odXJsLCBkYXRhLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIEZpbGVTYXZlci5zYXZlQXMocmVzLCB0aGlzLmdldEZ1bGxGaWxlTmFtZShuYW1lIHx8ICdFeHBvcnQnLCBUZW1wbGF0ZUNvbnN0YW50LldPUkRfRVhURU5TSU9OKSk7XG4gICAgICAgICAgICB9KS5jYXRjaChhc3luYyBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IGVyci5lcnJvci50ZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UoSlNPTi5wYXJzZShlcnJvclRleHQgfHwgJycpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBmaWxsVGVtcGxhdGVCeUNvZGVBbmRFeHBvcnRQZGYodGVtcGxhdGVDb2RlOiBzdHJpbmcsIGRhdGE6IGFueSwgbmFtZTogc3RyaW5nID0gJ0V4cG9ydCcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9maWxsV29yZEJ5VGVtcGxhdGVDb2RlLyR7dGVtcGxhdGVDb2RlfT9pc1ByaW50PXRydWVgO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50XG4gICAgICAgICAgICAucG9zdDxhbnk+KHVybCwgZGF0YSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gdGhpcy5iNjR0b0Jsb2IocmVzLmRhdGEsICdhcHBsaWNhdGlvbi9wZGYnKTtcbiAgICAgICAgICAgICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIHRoaXMuZ2V0RnVsbEZpbGVOYW1lKG5hbWUgfHwgJ0V4cG9ydCcsICcucGRmJykpO1xuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBlcnIuZXJyb3IudGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKEpTT04ucGFyc2UoZXJyb3JUZXh0IHx8ICcnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBiNjR0b0Jsb2IoYjY0RGF0YSwgY29udGVudFR5cGUgPSAnJywgc2xpY2VTaXplID0gNTEyKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5cyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnl0ZU51bWJlcnNbaV0gPSBzbGljZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XG4gICAgICAgICAgICBieXRlQXJyYXlzLnB1c2goYnl0ZUFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgICAgICByZXR1cm4gYmxvYjtcbiAgICB9XG5cbiAgICBsYVRleFRvQmFzZTY0SW1hZ2UobGFUZXg6IHN0cmluZywgZm9udDogbnVtYmVyID0gNTQpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGFwaSA9IGAke3RoaXMuc2VydmljZVVyaX0vTGF0ZXhUb0Jhc2U2NGA7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KGFwaSwgeyBsYVRleCwgZm9udCB9KS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBsYVRleFRvSW1hZ2UobGFUZXg6IHN0cmluZywgZm9udDogbnVtYmVyID0gNTQpIHtcbiAgICAgICAgY29uc3QgYXBpID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9MYXRleFRvSW1hZ2VgO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5wb3N0KGFwaSwgeyBsYVRleCwgZm9udCB9LCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KS50b1Byb21pc2UoKTtcbiAgICB9XG5cblxuICAgIGFzeW5jIF9leHBvcnQobW9kZWw6IEV4cG9ydEl0ZW0pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vZXhwb3J0YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHVybCwgbW9kZWwpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3J0IGEgdHJlZSBvZiBmb2xkZXJzLCBmaWxlcyB1c2luZyBiYWNrZ3JvdW5kIGpvYi5cbiAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgKi9cbiAgICBhc3luYyBleHBvcnQobW9kZWw6IEV4cG9ydEl0ZW0pIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0KG1vZGVsKVxuICAgICAgICAgICAgLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVGjDqm0geHXhuqV0IGZpbGUgdGjDoG5oIGPDtG5nIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RoYW8gdMOhYyBjaMawYSB0aMOgbmggY8O0bmcuIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXUhJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZS5sb2dJbmZvU2ltcGxlKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBfZXhwb3J0Tm9ybWFsKG1vZGVsOiBFeHBvcnRJdGVtKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L2V4cG9ydE5vcm1hbGA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0PFJlc3BvbnNlUmVzdWx0Pih1cmwsIG1vZGVsKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cG9ydCBhIHRyZWUgb2YgZm9sZGVycywgZmlsZXMgZGlyZWN0bHkuXG4gICAgICogQHBhcmFtIGRhdGEgcGFyYW0gxJHhu4MgZ2VuIHJhIGZpbGUgZXhjZWxcbiAgICAgKiBAcGFyYW0gaXNWaWV3T25saW5lIGPDsyBkw7luZyBmaWxlIHZpZXdlciDEkeG7gyB2aWV3IGZpbGUgb25saW5lIGtow7RuZ1xuICAgICAqL1xuICAgIGFzeW5jIGV4cG9ydE5vcm1hbChkYXRhOiBFeHBvcnRJdGVtLCBpc1ZpZXdPbmxpbmUgPSBmYWxzZSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydE5vcm1hbChkYXRhKVxuICAgICAgICAgICAgLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChycy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RJdGVtID0gcnMuZGF0YSBhcyBFeHBvcnRJdGVtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWaWV3T25saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogcm9vdEl0ZW0uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlsZVZlcnNpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiByb290SXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb3dubG9hZExpbmtTZXJ2aWNlLmRvd25sb2FkTGluayhuZXcgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiByb290SXRlbS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJZDogcm9vdEl0ZW0uZm9sZGVySWRcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3J1ZFNlcnZpY2UucHJvY2Vzc0Vycm9yUmVzcG9uc2UocnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RoYW8gdMOhYyBjaMawYSB0aMOgbmggY8O0bmcuIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaSBzYXUhJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZS5sb2dJbmZvU2ltcGxlKGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmdldFJlc3BvbnNlUmVzdWx0RnJvbUV4Y2VwdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiA8YW55PnJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBhc3luYyBfZXhwb3J0TXVsdGlTaGVldChtb2RlbDogRXhwb3J0SXRlbSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9leHBvcnRNdWx0aVNoZWV0YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHVybCwgbW9kZWwpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHLhuqMgduG7gSBleGNlbCBmaWxlIMSRw6MgZ2VuIHbhu5tpIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSBkYXRhIGThu68gbGnhu4d1IMSR4bqndSB2w6BvIMSR4buDIGdlbiB0ZW1wbGF0ZVxuICAgICAqIEBwYXJhbSBpc1ZpZXdPbmxpbmUgY8OzIGTDuW5nIGZpbGUgdmlld2VyIMSR4buDIHZpZXcgZmlsZSBvbmxpbmUga2jDtG5nXG4gICAgICovXG4gICAgYXN5bmMgZXhwb3J0TXVsdGlTaGVldChkYXRhOiBFeHBvcnRJdGVtLCBpc1ZpZXdPbmxpbmUgPSBmYWxzZSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydE11bHRpU2hlZXQoZGF0YSlcbiAgICAgICAgICAgIC50aGVuKHJzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocnMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb290SXRlbSA9IHJzLmRhdGEgYXMgRXhwb3J0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmlld09ubGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHJvb3RJdGVtLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpbGVWZXJzaW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcm9vdEl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG93bmxvYWRMaW5rU2VydmljZS5kb3dubG9hZExpbmsobmV3IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogcm9vdEl0ZW0uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVySWQ6IHJvb3RJdGVtLmZvbGRlcklkXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlLnByb2Nlc3NFcnJvclJlc3BvbnNlKHJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUaGFvIHTDoWMgY2jGsGEgdGjDoG5oIGPDtG5nLiBWdWkgbMOybmcgdGjhu60gbOG6oWkgc2F1IScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UubG9nSW5mb1NpbXBsZShlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5fY29tbW9uU2VydmljZS5nZXRSZXNwb25zZVJlc3VsdEZyb21FeGNlcHRpb24oZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gPGFueT5yZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -1149,6 +1149,8 @@ class AutoCompletePickerControlSchema extends EntityPickerControlSchema {
1149
1149
  this.isCheckWriteValue = false;
1150
1150
  this.usePicker = true;
1151
1151
  this.isCaching = false; // dùng riêng cho canBoPicker
1152
+ this.limitRowItem = false;
1153
+ this.maxRowItem = 2;
1152
1154
  for (const key in init) {
1153
1155
  this[key] = init[key];
1154
1156
  }
@@ -8574,6 +8576,10 @@ class TemplateInstanceService extends BaseService {
8574
8576
  const api = `${this.serviceUri}/LatexToBase64`;
8575
8577
  return this._httpClient.post(api, { laTex, font }).toPromise();
8576
8578
  }
8579
+ laTexToImage(laTex, font = 54) {
8580
+ const api = `${this.serviceUri}/LatexToImage`;
8581
+ return this._httpClient.post(api, { laTex, font }, { responseType: 'blob' }).toPromise();
8582
+ }
8577
8583
  _export(model) {
8578
8584
  return __awaiter(this, void 0, void 0, function* () {
8579
8585
  const url = `${this.serviceUri}/export`;
@@ -38822,7 +38828,7 @@ AutoCompletePickerComponent.decorators = [
38822
38828
  { type: Component, args: [{
38823
38829
  // tslint:disable-next-line: component-selector
38824
38830
  selector: 'autocomplete-picker',
38825
- template: "<div class=\"p-inputgroup autocomplete-picker\" *ngIf=\"control\" [class.has-value]=\"hasValue\"\n [class.multiple]=\"control.multiple\" [class.disabled]=\"control.disabled\">\n <div style=\"width: calc(100% - 28px)\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\">\n <p-autoComplete #autoComplete emptyMessage=\"Kh\u00F4ng c\u00F3 k\u1EBFt qu\u1EA3 n\u00E0o\" [ngClass]=\"'custom-autocomplete'\"\n [disabled]=\"disabled\" [placeholder]=\"control.placeholder\" [appendTo]=\"control.appendTo\" [maxRowItem]=\"2\"\n [suggestions]=\"results\" field=\"label\" [styleClass]=\"control.validators && control.required ? 'rq' : ''\"\n [multiple]=\"control.multiple\" [minLength]=\"2\" [(ngModel)]=\"selectedValueObject\"\n (onFocus)=\"handleFocus($event)\" (onBlur)=\"handleBlur($event)\" (completeMethod)=\"search($event)\"\n (onKeyUp)=\"handleKeyUp($event)\" (onSelect)=\"handleSelect($event)\" (onUnselect)=\"handleUnSelect($event)\">\n </p-autoComplete>\n </div>\n <span *ngIf=\"!control.multiple && !disabled && hasValue\" class=\"icon-clear\" (click)=\"clearValue()\"><i\n class=\"fas fa-times\"></i></span>\n <button class=\"custom-autocomplete-button\" *ngIf=\"control.usePicker\" [disabled]=\"disabled\" tabindex=\"-1\"\n (click)=\"showPickForm()\" pButton [pTooltip]=\"control.title\" icon=\"fas fa-external-link-alt\"\n type=\"button\"></button>\n</div>\n<tn-dialog #dialog *ngIf=\"showFormPicker\" styleClass=\"entity-picker-box-dialog no-padding\" [useDefaultScrollBar]=\"true\"\n [header]=\"control.title | translate\" [popupSize]=\"popupSize\" (onHide)=\"handleHide($event)\">\n <entity-picker-box #entityPickerBox [currentNode]=\"currentNode\" [control]=\"control\" [parentSetting]=\"setting\" [datasourceFieldFilter]=\"datasourceFieldFilter\"\n [advanceData]=\"advanceData\" [readOnlyValues]=\"readOnlyValues\" [selectedValue]=\"selectedValue\"\n (onContentLeftInit)=\"handleContentLeftInit($event)\" (onContentRightInit)=\"handleContentRightInit($event)\"\n (onChanged)=\"handleChangeEntity($event)\" (onSelect)=\"handleSelectEntity($event)\"\n (onUnSelect)=\"handleUnSelectEntity($event)\" (onDone)=\"handleHide($event)\"\n (onRowSelect)=\"handleRowSelect($event)\">\n </entity-picker-box>\n <ng-template #footer>\n <button type=\" button\" pButton class=\"p-button-text\" (click)=\"onClickSubmitButton($event, entityPickerBox)\"\n [label]=\"'Ho\u00E0n th\u00E0nh' | translate\" icon=\"pi pi-check\"></button>\n </ng-template>\n</tn-dialog>",
38831
+ template: "<div class=\"p-inputgroup autocomplete-picker\" *ngIf=\"control\" [class.has-value]=\"hasValue\"\n [class.multiple]=\"control.multiple\" [class.disabled]=\"control.disabled\">\n <div style=\"width: calc(100% - 28px)\" [pTooltip]=\"tooltip\" tooltipPosition=\"top\">\n <p-autoComplete #autoComplete [limitRowItem]=\"control.limitRowItem\" emptyMessage=\"Kh\u00F4ng c\u00F3 k\u1EBFt qu\u1EA3 n\u00E0o\"\n [ngClass]=\"'custom-autocomplete'\" [disabled]=\"disabled\" [placeholder]=\"control.placeholder\"\n [appendTo]=\"control.appendTo\" [maxRowItem]=\"control.maxRowItem\" [suggestions]=\"results\" field=\"label\"\n [styleClass]=\"control.validators && control.required ? 'rq' : ''\" [multiple]=\"control.multiple\"\n [minLength]=\"2\" [(ngModel)]=\"selectedValueObject\" (onFocus)=\"handleFocus($event)\"\n (onBlur)=\"handleBlur($event)\" (completeMethod)=\"search($event)\" (onKeyUp)=\"handleKeyUp($event)\"\n (onSelect)=\"handleSelect($event)\" (onUnselect)=\"handleUnSelect($event)\">\n </p-autoComplete>\n </div>\n <span *ngIf=\"!control.multiple && !disabled && hasValue\" class=\"icon-clear\" (click)=\"clearValue()\"><i\n class=\"fas fa-times\"></i></span>\n <button class=\"custom-autocomplete-button\" *ngIf=\"control.usePicker\" [disabled]=\"disabled\" tabindex=\"-1\"\n (click)=\"showPickForm()\" pButton [pTooltip]=\"control.title\" icon=\"fas fa-external-link-alt\"\n type=\"button\"></button>\n</div>\n<tn-dialog #dialog *ngIf=\"showFormPicker\" styleClass=\"entity-picker-box-dialog no-padding\" [useDefaultScrollBar]=\"true\"\n [header]=\"control.title | translate\" [popupSize]=\"popupSize\" (onHide)=\"handleHide($event)\">\n <entity-picker-box #entityPickerBox [currentNode]=\"currentNode\" [control]=\"control\" [parentSetting]=\"setting\"\n [datasourceFieldFilter]=\"datasourceFieldFilter\" [advanceData]=\"advanceData\" [readOnlyValues]=\"readOnlyValues\"\n [selectedValue]=\"selectedValue\" (onContentLeftInit)=\"handleContentLeftInit($event)\"\n (onContentRightInit)=\"handleContentRightInit($event)\" (onChanged)=\"handleChangeEntity($event)\"\n (onSelect)=\"handleSelectEntity($event)\" (onUnSelect)=\"handleUnSelectEntity($event)\"\n (onDone)=\"handleHide($event)\" (onRowSelect)=\"handleRowSelect($event)\">\n </entity-picker-box>\n <ng-template #footer>\n <button type=\" button\" pButton class=\"p-button-text\" (click)=\"onClickSubmitButton($event, entityPickerBox)\"\n [label]=\"'Ho\u00E0n th\u00E0nh' | translate\" icon=\"pi pi-check\"></button>\n </ng-template>\n</tn-dialog>",
38826
38832
  providers: [
38827
38833
  {
38828
38834
  provide: NG_VALUE_ACCESSOR,
@@ -43032,6 +43038,7 @@ class AutoComplete {
43032
43038
  this.showTransitionOptions = '.12s cubic-bezier(0, 0, 0.2, 1)';
43033
43039
  this.hideTransitionOptions = '.1s linear';
43034
43040
  this.autocomplete = 'off';
43041
+ this.limitRowItem = false;
43035
43042
  this.onModelChange = () => { };
43036
43043
  this.onModelTouched = () => { };
43037
43044
  this.showCountItem = false;
@@ -43044,8 +43051,8 @@ class AutoComplete {
43044
43051
  set maxRowItem(value) {
43045
43052
  const rowHeight = 27;
43046
43053
  const padding = 7;
43047
- this._maxHeighContainerItem = Math.round(value * 30.5) + 7;
43048
- this._maxHeighContainerItemStr = this._maxHeighContainerItem.toString() + 'px';
43054
+ this._maxHeighContainerItem = Math.round(value * (rowHeight + padding / 2)) + padding;
43055
+ this._maxHeighContainerItemStr = !this.limitRowItem ? '10000px' : this._maxHeighContainerItem.toString() + 'px';
43049
43056
  }
43050
43057
  get suggestions() {
43051
43058
  return this._suggestions;
@@ -43075,7 +43082,7 @@ class AutoComplete {
43075
43082
  }, 1);
43076
43083
  this.highlightOptionChanged = false;
43077
43084
  }
43078
- if (this.multiContainerEL) {
43085
+ if (this.multiContainerEL && this.limitRowItem) {
43079
43086
  var lastItemSelected = DomHandler.findSingle(this.multiContainerEL.nativeElement, 'li:first-child');
43080
43087
  this.multiContainerEL.nativeElement.scrollTop = 10000;
43081
43088
  let rectParent = this.multiContainerEL.nativeElement.getBoundingClientRect();
@@ -43560,46 +43567,7 @@ class AutoComplete {
43560
43567
  AutoComplete.decorators = [
43561
43568
  { type: Component, args: [{
43562
43569
  selector: 'p-autoComplete',
43563
- template: `
43564
- <span #container [ngClass]="{'p-autocomplete p-component':true,'p-autocomplete-dd':dropdown,'p-autocomplete-multiple':multiple}" [ngStyle]="style" [class]="styleClass">
43565
- <input *ngIf="!multiple" #in [attr.type]="type" [attr.id]="inputId" [ngStyle]="inputStyle" [class]="inputStyleClass" [autocomplete]="autocomplete" [attr.required]="required" [attr.name]="name"
43566
- class="p-autocomplete-input p-inputtext p-component" [ngClass]="{'p-autocomplete-dd-input':dropdown,'p-disabled': disabled}" [value]="inputFieldValue" aria-autocomplete="list" [attr.aria-controls]="listId" role="searchbox" [attr.aria-expanded]="overlayVisible" aria-haspopup="true" [attr.aria-activedescendant]="'p-highlighted-option'"
43567
- (click)="onInputClick($event)" (input)="onInput($event)" (keydown)="onKeydown($event)" (keyup)="onKeyup($event)" [attr.autofocus]="autofocus" (focus)="onInputFocus($event)" (blur)="onInputBlur($event)" (change)="onInputChange($event)" (paste)="onInputPaste($event)"
43568
- [attr.placeholder]="placeholder" [attr.size]="size" [attr.maxlength]="maxlength" [attr.tabindex]="tabindex" [readonly]="readonly" [disabled]="disabled" [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledBy" [attr.aria-required]="required"
43569
- ><ul *ngIf="multiple" #multiContainer class="p-autocomplete-multiple-container p-component p-inputtext" [ngClass]="{'p-disabled':disabled,'p-focus':focus}" (click)="multiIn.focus()" [style.max-height]="_maxHeighContainerItemStr">
43570
- <li #token *ngFor="let val of value" class="p-autocomplete-token" [class.disabled]="val._disabled">
43571
- <ng-container *ngTemplateOutlet="selectedItemTemplate; context: {$implicit: val}"></ng-container>
43572
- <span *ngIf="!selectedItemTemplate" class="p-autocomplete-token-label">{{resolveFieldData(val)}}</span>
43573
- <span *ngIf="!disabled && !val._disabled" class="p-autocomplete-token-icon pi pi-times-circle" (click)="removeItem(token)"></span>
43574
- </li>
43575
- <li class="p-autocomplete-token p-autocomplete-countItem" *ngIf="showCountItem && value " (click)="showMore()">Có {{value.length}} bản ghi ...</li>
43576
- <!-- <ng-container *ngIf="value?.length > 10">
43577
- <li class="p-autocomplete-token p-autocomplete-countItem" (click)="showMore()">
43578
- Có {{value.length}} bản ghi ...
43579
- </li>
43580
- </ng-container> -->
43581
- <li class="p-autocomplete-token p-autocomplete-countItem" *ngIf="_maxHeighContainerItemStrOld != null" (click)="showLess()"><span><i class="fas fa-arrow-up"></i></span><span>Thu lại</span></li>
43582
- <li class="p-autocomplete-input-token">
43583
- <input #multiIn [attr.type]="type" [attr.id]="inputId" [disabled]="disabled" [attr.placeholder]="(value&&value.length ? null : placeholder)" [attr.tabindex]="tabindex" [attr.maxlength]="maxlength" (input)="onInput($event)" (click)="onInputClick($event)"
43584
- (keydown)="onKeydown($event)" [readonly]="readonly" (keyup)="onKeyup($event)" [attr.autofocus]="autofocus" (focus)="onInputFocus($event)" (blur)="onInputBlur($event)" (change)="onInputChange($event)" (paste)="onInputPaste($event)" [autocomplete]="autocomplete"
43585
- [ngStyle]="inputStyle" [class]="inputStyleClass" [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledBy" [attr.aria-required]="required"
43586
- aria-autocomplete="list" [attr.aria-controls]="listId" role="searchbox" [attr.aria-expanded]="overlayVisible" aria-haspopup="true" [attr.aria-activedescendant]="'p-highlighted-option'">
43587
- </li>
43588
- </ul>
43589
- <i *ngIf="loading" class="p-autocomplete-loader pi pi-spinner pi-spin"></i><button #ddBtn type="button" pButton [icon]="dropdownIcon" class="p-autocomplete-dropdown" [disabled]="disabled" pRipple
43590
- (click)="handleDropdownClick($event)" *ngIf="dropdown" [attr.tabindex]="tabindex"></button>
43591
- <div #panel *ngIf="overlayVisible" [ngClass]="['p-autocomplete-panel p-component']" [style.max-height]="scrollHeight" [ngStyle]="panelStyle" [class]="panelStyleClass"
43592
- [@overlayAnimation]="{value: 'visible', params: {showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions}}" (@overlayAnimation.start)="onOverlayAnimationStart($event)" (@overlayAnimation.done)="onOverlayAnimationDone($event)" >
43593
- <ul role="listbox" [attr.id]="listId" class="p-autocomplete-items">
43594
- <li role="option" *ngFor="let option of suggestions; let idx = index" class="p-autocomplete-item" pRipple [ngClass]="{'p-highlight': (option === highlightOption)}" [id]="highlightOption == option ? 'p-highlighted-option':''" (click)="selectItem(option)">
43595
- <span *ngIf="!itemTemplate">{{resolveFieldData(option)}}</span>
43596
- <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: option, index: idx}"></ng-container>
43597
- </li>
43598
- <li *ngIf="noResults && emptyMessage" class="p-autocomplete-emptymessage p-autocomplete-item">{{emptyMessage}}</li>
43599
- </ul>
43600
- </div>
43601
- </span>
43602
- `,
43570
+ template: "<span #container\n [ngClass]=\"{'p-autocomplete p-component':true,'p-autocomplete-dd':dropdown,'p-autocomplete-multiple':multiple}\"\n [ngStyle]=\"style\" [class]=\"styleClass\">\n <input *ngIf=\"!multiple\" #in [attr.type]=\"type\" [attr.id]=\"inputId\" [ngStyle]=\"inputStyle\" [class]=\"inputStyleClass\"\n [autocomplete]=\"autocomplete\" [attr.required]=\"required\" [attr.name]=\"name\"\n class=\"p-autocomplete-input p-inputtext p-component\"\n [ngClass]=\"{'p-autocomplete-dd-input':dropdown,'p-disabled': disabled}\" [value]=\"inputFieldValue\"\n aria-autocomplete=\"list\" [attr.aria-controls]=\"listId\" role=\"searchbox\" [attr.aria-expanded]=\"overlayVisible\"\n aria-haspopup=\"true\" [attr.aria-activedescendant]=\"'p-highlighted-option'\" (click)=\"onInputClick($event)\"\n (input)=\"onInput($event)\" (keydown)=\"onKeydown($event)\" (keyup)=\"onKeyup($event)\" [attr.autofocus]=\"autofocus\"\n (focus)=\"onInputFocus($event)\" (blur)=\"onInputBlur($event)\" (change)=\"onInputChange($event)\"\n (paste)=\"onInputPaste($event)\" [attr.placeholder]=\"placeholder\" [attr.size]=\"size\" [attr.maxlength]=\"maxlength\"\n [attr.tabindex]=\"tabindex\" [readonly]=\"readonly\" [disabled]=\"disabled\" [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\" [attr.aria-required]=\"required\">\n <ul *ngIf=\"multiple\" #multiContainer class=\"p-autocomplete-multiple-container p-component p-inputtext\"\n [ngClass]=\"{'p-disabled':disabled,'p-focus':focus}\" (click)=\"multiIn.focus()\"\n [style.max-height]=\"_maxHeighContainerItemStr\">\n <li #token *ngFor=\"let val of value\" class=\"p-autocomplete-token\" [class.disabled]=\"val._disabled\">\n <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: {$implicit: val}\"></ng-container>\n <span *ngIf=\"!selectedItemTemplate\" class=\"p-autocomplete-token-label\">{{resolveFieldData(val)}}</span>\n <span *ngIf=\"!disabled && !val._disabled\" class=\"p-autocomplete-token-icon pi pi-times-circle\"\n (click)=\"removeItem(token)\"></span>\n </li>\n <li class=\"p-autocomplete-token p-autocomplete-countItem\" *ngIf=\"showCountItem && value \" (click)=\"showMore()\">\n C\u00F3 {{value.length}} b\u1EA3n ghi ...</li>\n <li class=\"p-autocomplete-token p-autocomplete-countItem\" *ngIf=\"_maxHeighContainerItemStrOld != null\"\n (click)=\"showLess()\"><span><i class=\"fas fa-arrow-up\"></i></span><span>Thu l\u1EA1i</span></li>\n <li class=\"p-autocomplete-input-token\">\n <input #multiIn [attr.type]=\"type\" [attr.id]=\"inputId\" [disabled]=\"disabled\"\n [attr.placeholder]=\"(value&&value.length ? null : placeholder)\" [attr.tabindex]=\"tabindex\"\n [attr.maxlength]=\"maxlength\" (input)=\"onInput($event)\" (click)=\"onInputClick($event)\"\n (keydown)=\"onKeydown($event)\" [readonly]=\"readonly\" (keyup)=\"onKeyup($event)\"\n [attr.autofocus]=\"autofocus\" (focus)=\"onInputFocus($event)\" (blur)=\"onInputBlur($event)\"\n (change)=\"onInputChange($event)\" (paste)=\"onInputPaste($event)\" [autocomplete]=\"autocomplete\"\n [ngStyle]=\"inputStyle\" [class]=\"inputStyleClass\" [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\" [attr.aria-required]=\"required\" aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listId\" role=\"searchbox\" [attr.aria-expanded]=\"overlayVisible\"\n aria-haspopup=\"true\" [attr.aria-activedescendant]=\"'p-highlighted-option'\">\n </li>\n </ul>\n <i *ngIf=\"loading\" class=\"p-autocomplete-loader pi pi-spinner pi-spin\"></i><button #ddBtn type=\"button\" pButton\n [icon]=\"dropdownIcon\" class=\"p-autocomplete-dropdown\" [disabled]=\"disabled\" pRipple\n (click)=\"handleDropdownClick($event)\" *ngIf=\"dropdown\" [attr.tabindex]=\"tabindex\"></button>\n <div #panel *ngIf=\"overlayVisible\" [ngClass]=\"['p-autocomplete-panel p-component']\"\n [style.max-height]=\"scrollHeight\" [ngStyle]=\"panelStyle\" [class]=\"panelStyleClass\"\n [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions}}\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationDone($event)\">\n <ul role=\"listbox\" [attr.id]=\"listId\" class=\"p-autocomplete-items\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" class=\"p-autocomplete-item\" pRipple\n [ngClass]=\"{'p-highlight': (option === highlightOption)}\"\n [id]=\"highlightOption == option ? 'p-highlighted-option':''\" (click)=\"selectItem(option)\">\n <span *ngIf=\"!itemTemplate\">{{resolveFieldData(option)}}</span>\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: option, index: idx}\"></ng-container>\n </li>\n <li *ngIf=\"noResults && emptyMessage\" class=\"p-autocomplete-emptymessage p-autocomplete-item\">\n {{emptyMessage}}</li>\n </ul>\n </div>\n</span>",
43603
43571
  animations: [
43604
43572
  trigger('overlayAnimation', [
43605
43573
  transition(':enter', [
@@ -43677,6 +43645,7 @@ AutoComplete.propDecorators = {
43677
43645
  hideTransitionOptions: [{ type: Input }],
43678
43646
  autofocus: [{ type: Input }],
43679
43647
  autocomplete: [{ type: Input }],
43648
+ limitRowItem: [{ type: Input }],
43680
43649
  maxRowItem: [{ type: Input }],
43681
43650
  containerEL: [{ type: ViewChild, args: ['container',] }],
43682
43651
  inputEL: [{ type: ViewChild, args: ['in',] }],
@@ -46973,6 +46942,9 @@ class UserPickerComponent extends ComponentBase {
46973
46942
  item = this.reStructureItemObject(item);
46974
46943
  arr.push(item);
46975
46944
  }
46945
+ if (this.controlPicker.modifyDataSelected) {
46946
+ yield this.controlPicker.modifyDataSelected(arr);
46947
+ }
46976
46948
  this.dataSource = arr;
46977
46949
  }
46978
46950
  else {