@adlfe/campaign-management-library 2.11.7 → 2.12.0

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.
@@ -296,16 +296,18 @@ var GeneralInformationWAComponent = /** @class */ (function () {
296
296
  };
297
297
  GeneralInformationWAComponent.prototype.validateText = function (account) {
298
298
  var _this = this;
299
- var _a;
299
+ var _a, _b;
300
300
  this.isCheckUtility = true;
301
- var _b = this.form.value, from = _b.from, text = _b.text;
302
- if (!text && !from)
301
+ var _c = this.form.value, from = _c.from, text = _c.text;
302
+ if (!text || !from)
303
+ return;
304
+ if (!((_a = from) === null || _a === void 0 ? void 0 : _a.directSendEnabled))
303
305
  return;
304
306
  var headers = new HttpHeaders()
305
307
  .set('Authorization', 'Bearer ' + localStorage.getItem('telin.accessToken'))
306
308
  .set('Access-Control-Allow-Origin', '*');
307
309
  this.httpClient
308
- .post(environment.api + "/message/direct-send/" + ((_a = (from || account)) === null || _a === void 0 ? void 0 : _a.id), {
310
+ .post(environment.api + "/message/direct-send/" + ((_b = (from || account)) === null || _b === void 0 ? void 0 : _b.id), {
309
311
  type: 'text',
310
312
  text: { body: text },
311
313
  }, { headers: headers })
@@ -745,11 +747,11 @@ var GeneralInformationWAComponent = /** @class */ (function () {
745
747
  GeneralInformationWAComponent = __decorate([
746
748
  Component({
747
749
  selector: 'lib-general-information-wa',
748
- template: "<form autocomplete=\"off\" [formGroup]=\"form\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Message Type</mat-label>\r\n\r\n <mat-select placeholder=\"Select message type\" formControlName=\"channel\">\r\n <mat-option\r\n *ngFor=\"let option of msgTypeWAOption\"\r\n [value]=\"option.code\"\r\n (click)=\"formReset()\"\r\n >\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.channel\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('channel')?.touched && form.get('channel')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n\r\n <div\r\n *ngIf=\"!getIsTemplate\"\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 16px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div>\r\n If you select this channel, keep in mind that the message might not be delivered to\r\n all selected customers. This is because the customer must have had a conversation\r\n previously with BSP.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getIsText\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Text</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('text')?.touched && form.get('text')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsMedia\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Media Type</mat-label>\r\n\r\n <mat-select\r\n placeholder=\"Select media type\"\r\n formControlName=\"media\"\r\n (selectionChange)=\"updateMediaType($event.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of mediaTypeOption\" [value]=\"option.code\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.media\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('media').touched && form.get('media').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() !== 'location'\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.fileName\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('fileName').touched &&\r\n form.get('fileName').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() === 'location'\">\r\n <div class=\"w-100\">\r\n <h4 class=\"asterix--after\">Location</h4>\r\n\r\n <div class=\"w-100\">\r\n <agm-map\r\n style=\"width: 100%; height: 400px\"\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [disableDoubleClickZoom]=\"maps.isDoubleClickZoom\"\r\n [zoom]=\"maps.zoom\"\r\n >\r\n <agm-marker\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [markerDraggable]=\"maps.isDraggable\"\r\n (dragEnd)=\"markerDragEnd($event)\"\r\n ></agm-marker>\r\n </agm-map>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Location</mat-label>\r\n\r\n <input\r\n #mapSearch\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n placeholder=\"Enter location here\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsTemplate\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"getTemplateOptionService($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div *ngIf=\"isHaveTemplateParam\" class=\"d-flex justify-content-end\">\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isUpload\"\r\n (change)=\"updateDownloadCSV($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUpload')?.value\">\r\n <div\r\n *ngIf=\"form.get('template')?.value?.category === 'AUTHENTICATION'\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label> OTP Value </mat-label>\r\n\r\n <input matInput type=\"text\" formControlName=\"otpValue\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getParamHeader?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold\">Header Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamHeader; let paramHeaderIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramHeaderIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramHeaderIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getParamBody?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Body Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamBody; let paramBodyIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramBodyIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramBodyIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isShowParameter\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Button Parameter</p>\r\n\r\n <ng-container *ngFor=\"let button of getButton; let buttonIndex = index\">\r\n <ng-container *ngIf=\"getParamButton(buttonIndex)?.length > 0\">\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ buttonIndex + 1 }}</p>\r\n\r\n <div\r\n *ngFor=\"\r\n let param of getParamButton(buttonIndex);\r\n let paramIndex = index\r\n \"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n ['image', 'video', 'document'].includes(\r\n form.get('template')?.value?.header?.type?.toLowerCase()\r\n )\r\n \"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">File</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsCatalogue\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Category</mat-label>\r\n\r\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\r\n <mat-option *ngFor=\"let option of categoryOption\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.category\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('category')?.touched &&\r\n form.get('category')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Catalog</mat-label>\r\n\r\n <mat-select formControlName=\"catalogue\" placeholder=\"Select catalog\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.catalogue\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('catalogue')?.touched &&\r\n form.get('catalogue')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"form.get('category')?.value === 'product'\"\r\n style=\"padding: 8px; border-radius: 8px; border: 1px solid #6177c4\"\r\n >\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Product</mat-label>\r\n\r\n <mat-select formControlName=\"product\" placeholder=\"Select product\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.product\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('product')?.touched &&\r\n form.get('product')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Body</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n formControlName=\"body\"\r\n placeholder=\"Enter body\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsUtility\">\r\n <div style=\"display: grid; gap: 0.5rem\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n <mat-radio-group\r\n style=\"display: flex; gap: 0.5rem; flex-wrap: wrap\"\r\n formControlName=\"isUseExistingTemplate\"\r\n (change)=\"handleChangeTemplate($event.value)\"\r\n >\r\n <mat-radio-button\r\n [value]=\"option.value\"\r\n *ngFor=\"let option of templates\"\r\n color=\"primary\"\r\n >\r\n {{ option.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"handleChangeFrom($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUseExistingTemplate')?.value; else existingTmpl\">\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div>\r\n Direct Send access restricted for 30 days due to continued misuse. Final warning\r\n before permanent revocation.\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Body</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('text').touched && form.get('text').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n ></app-input>\r\n </div>\r\n\r\n <div *ngIf=\"!isReadOnlyMode\">\r\n <mat-checkbox formControlName=\"isNeedSave\">\r\n Save this message as future template\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n *ngIf=\"!isUtility\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div>\r\n Copy mismatch. This copy is not Utility content. Please revise to proceed.\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #existingTmpl>\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div>\r\n Direct Send access restricted for 30 days due to continued misuse. Final warning\r\n before permanent revocation.\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n ></app-input>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</form>\r\n",
750
+ template: "<form autocomplete=\"off\" [formGroup]=\"form\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Message Type</mat-label>\r\n\r\n <mat-select placeholder=\"Select message type\" formControlName=\"channel\">\r\n <mat-option\r\n *ngFor=\"let option of msgTypeWAOption\"\r\n [value]=\"option.code\"\r\n (click)=\"formReset()\"\r\n >\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.channel\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('channel')?.touched && form.get('channel')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n\r\n <div\r\n *ngIf=\"!getIsTemplate\"\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 16px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div *ngIf=\"!getIsUtility\">\r\n If you select this channel, keep in mind that the message might not be delivered to\r\n all selected customers. This is because the customer must have had a conversation\r\n previously with BSP.\r\n </div>\r\n\r\n <div *ngIf=\"getIsUtility\">\r\n You can send directly a utility message. You can choose between existing utility\r\n templates or creating a new one. If you create a new template, the system may check\r\n whether the content already exists as a template.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getIsText\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Text</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('text')?.touched && form.get('text')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsMedia\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Media Type</mat-label>\r\n\r\n <mat-select\r\n placeholder=\"Select media type\"\r\n formControlName=\"media\"\r\n (selectionChange)=\"updateMediaType($event.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of mediaTypeOption\" [value]=\"option.code\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.media\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('media').touched && form.get('media').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() !== 'location'\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.fileName\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('fileName').touched &&\r\n form.get('fileName').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() === 'location'\">\r\n <div class=\"w-100\">\r\n <h4 class=\"asterix--after\">Location</h4>\r\n\r\n <div class=\"w-100\">\r\n <agm-map\r\n style=\"width: 100%; height: 400px\"\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [disableDoubleClickZoom]=\"maps.isDoubleClickZoom\"\r\n [zoom]=\"maps.zoom\"\r\n >\r\n <agm-marker\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [markerDraggable]=\"maps.isDraggable\"\r\n (dragEnd)=\"markerDragEnd($event)\"\r\n ></agm-marker>\r\n </agm-map>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Location</mat-label>\r\n\r\n <input\r\n #mapSearch\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n placeholder=\"Enter location here\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsTemplate\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"getTemplateOptionService($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div *ngIf=\"isHaveTemplateParam\" class=\"d-flex justify-content-end\">\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isUpload\"\r\n (change)=\"updateDownloadCSV($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUpload')?.value\">\r\n <div\r\n *ngIf=\"form.get('template')?.value?.category === 'AUTHENTICATION'\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label> OTP Value </mat-label>\r\n\r\n <input matInput type=\"text\" formControlName=\"otpValue\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getParamHeader?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold\">Header Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamHeader; let paramHeaderIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramHeaderIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramHeaderIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getParamBody?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Body Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamBody; let paramBodyIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramBodyIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramBodyIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isShowParameter\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Button Parameter</p>\r\n\r\n <ng-container *ngFor=\"let button of getButton; let buttonIndex = index\">\r\n <ng-container *ngIf=\"getParamButton(buttonIndex)?.length > 0\">\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ buttonIndex + 1 }}</p>\r\n\r\n <div\r\n *ngFor=\"\r\n let param of getParamButton(buttonIndex);\r\n let paramIndex = index\r\n \"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n ['image', 'video', 'document'].includes(\r\n form.get('template')?.value?.header?.type?.toLowerCase()\r\n )\r\n \"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">File</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsCatalogue\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Category</mat-label>\r\n\r\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\r\n <mat-option *ngFor=\"let option of categoryOption\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.category\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('category')?.touched &&\r\n form.get('category')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Catalog</mat-label>\r\n\r\n <mat-select formControlName=\"catalogue\" placeholder=\"Select catalog\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.catalogue\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('catalogue')?.touched &&\r\n form.get('catalogue')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"form.get('category')?.value === 'product'\"\r\n style=\"padding: 8px; border-radius: 8px; border: 1px solid #6177c4\"\r\n >\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Product</mat-label>\r\n\r\n <mat-select formControlName=\"product\" placeholder=\"Select product\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.product\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('product')?.touched &&\r\n form.get('product')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Body</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n formControlName=\"body\"\r\n placeholder=\"Enter body\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsUtility\">\r\n <div style=\"display: grid; gap: 0.5rem\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n <mat-radio-group\r\n style=\"display: flex; gap: 0.5rem; flex-wrap: wrap\"\r\n formControlName=\"isUseExistingTemplate\"\r\n (change)=\"handleChangeTemplate($event.value)\"\r\n >\r\n <mat-radio-button\r\n [value]=\"option.value\"\r\n *ngFor=\"let option of templates\"\r\n color=\"primary\"\r\n >\r\n {{ option.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"handleChangeFrom($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUseExistingTemplate')?.value; else existingTmpl\">\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Body</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('text').touched && form.get('text').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n ></app-input>\r\n </div>\r\n\r\n <div *ngIf=\"!isReadOnlyMode\">\r\n <mat-checkbox formControlName=\"isNeedSave\">\r\n Save this message as future template\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n *ngIf=\"!isUtility\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div>\r\n Copy mismatch. This copy is not Utility content. Please revise to proceed.\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #existingTmpl>\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n ></app-input>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</form>\r\n\r\n<ng-template #stageAlertTmpl>\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n *ngIf=\"form.get('from')?.value && form.get('from')?.value?.directSendRestrictionStage > 0\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 1\">\r\n Direct Send misuse detected. Please review your messaging practices.\r\n </div>\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 2\">\r\n Direct Send access restricted for 7 days due to continued misuse.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 3\">\r\n Direct Send access restricted for 30 days due to continued misuse. Final warning before\r\n permanent revocation.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 4\">\r\n Direct Send access has been permanently revoked.\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
749
751
  styles: [".asterix--after:after{content:\"*\";color:red}"]
750
752
  })
751
753
  ], GeneralInformationWAComponent);
752
754
  return GeneralInformationWAComponent;
753
755
  }());
754
756
  export { GeneralInformationWAComponent };
755
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRsZmUvY2FtcGFpZ24tbWFuYWdlbWVudC1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2NhbXBhaWduLW1hbmFnZW1lbnQvbW9kdWxlcy9uZXctY2FtcGFpZ24vY29tcG9uZW50cy9nZW5lcmFsLWluZm9ybWF0aW9uLXdhL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekUsT0FBTyxFQUNILDBDQUEwQyxFQUMxQyxvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3ZCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7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OHhCekM7SUFBRCxvQ0FBQztDQUFBLEFBOXhCRCxJQTh4QkM7U0E5eEJZLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hcHNBUElMb2FkZXIgfSBmcm9tICdAYWdtL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7XHJcbiAgICBHZW5lcmFsSW5mb3JtYXRpb25XQU1lc3NhZ2VWYWxpZGF0aW9uQ29uc3QsXHJcbiAgICBNZWRpYVR5cGVPcHRpb25Db25zdCxcclxuICAgIE1zZ1R5cGVXQU9wdGlvbkNvbnN0LFxyXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvY29uc3QnO1xyXG5pbXBvcnQgeyBQcm9kdWN0Q2F0ZWdvcnlFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9lbnVtcyc7XHJcbmltcG9ydCB7IEJhc2VPcHRpb25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvdXRpbC9hcGktYWRhcHRlci1zZXJ2aWNlLW1vZGVscyc7XHJcbmltcG9ydCB7IEFwcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvdXRpbC9hcGktZHRvL3Jlc3BvbnNlLW1vZGVscyc7XHJcbmltcG9ydCB7IEFwaUFkYXB0ZXJTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZUVudW1PcHRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL3V0aWwnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVdBTW9kZWwsIFdoYXRzQXBwQWNjb3VudER0byB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEVudW1EYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbC9lbnVtcyc7XHJcbmltcG9ydCB7IFZhbGlkYXRvcnMgYXMgQ3VzdG9tVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3ZhbGlkYXRvcnMnO1xyXG5cclxuaW50ZXJmYWNlIElNYXBzIHtcclxuICAgIHpvb206IG51bWJlcjtcclxuICAgIGxhdGl0dWRlOiBudW1iZXI7XHJcbiAgICBsb25naXR1ZGU6IG51bWJlcjtcclxuICAgIGlzRHJhZ2dhYmxlOiBib29sZWFuO1xyXG4gICAgaXNEb3VibGVDbGlja1pvb206IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZ2VuZXJhbC1pbmZvcm1hdGlvbi13YScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9nZW5lcmFsLWluZm9ybWF0aW9uLXdhLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmFsSW5mb3JtYXRpb25XQUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm06IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+O1xyXG5cclxuICAgIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgICBwdWJsaWMgbXNnVHlwZVdBT3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gICAgcHVibGljIG1lZGlhVHlwZU9wdGlvbjogYW55W10gPSBbXTtcclxuICAgIHB1YmxpYyBjYXRlZ29yeU9wdGlvbjogQmFzZU9wdGlvbk1vZGVsW107XHJcbiAgICBwdWJsaWMgYWNjb3VudE9wdGlvbjogV2hhdHNBcHBBY2NvdW50RHRvW10gPSBbXTtcclxuICAgIHB1YmxpYyBpc0hhdmVOZXh0QWNjb3VudE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nQWNjb3VudE9wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHRlbXBsYXRlT3B0aW9uOiBUZW1wbGF0ZVdBTW9kZWxbXSA9IFtdO1xyXG4gICAgcHVibGljIGlzSGF2ZU5leHRUZW1wbGF0ZU9wdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nVGVtcGxhdGVPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpc0hhdmVUZW1wbGF0ZVBhcmFtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNTaG93UGFyYW1ldGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnk7XHJcbiAgICBwdWJsaWMgZXh0RmlsZUFjY2VwdGVkOiBzdHJpbmcgPSAnaW1hZ2UvKic7XHJcbiAgICBwdWJsaWMgbWFwczogSU1hcHM7XHJcblxyXG4gICAgcHJpdmF0ZSBwYWdlTm9BY2NvdW50T3B0aW9uOiBudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBwYWdlTm9UZW1wbGF0ZU9wdGlvbjogbnVtYmVyID0gMTtcclxuICAgIHByaXZhdGUgc3Vic2NyaWJlcnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgICBwcml2YXRlIGdlb0NvZGVyOiBhbnk7XHJcblxyXG4gICAgcHVibGljIHRlbXBsYXRlcyA9IFtcclxuICAgICAgICB7IGxhYmVsOiAnQ3JlYXRlIE5ldycsIHZhbHVlOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdVc2UgZXhpc3RpbmcgdGVtcGxhdGUnLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZWFkT25seU1vZGU6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBpc1RvdWNoZWRGb3JtKHN0YXR1czogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy51cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0uZW1pdCh0aGlzLmZvcm0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ21hcFNlYXJjaCcpIG1hcFNlYXJjaFJlZjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBwdWJsaWMgaXNVdGlsaXR5OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBpc0NoZWNrVXRpbGl0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICAgICAgcHJpdmF0ZSBtYXBzQVBJTG9hZGVyOiBNYXBzQVBJTG9hZGVyLFxyXG4gICAgICAgIHByaXZhdGUgYXBpQWRhcHRlclNlcnZpY2U6IEFwaUFkYXB0ZXJTZXJ2aWNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1zZ1R5cGVXQU9wdGlvbiA9IE1zZ1R5cGVXQU9wdGlvbkNvbnN0O1xyXG4gICAgICAgIHRoaXMubWVkaWFUeXBlT3B0aW9uID0gTWVkaWFUeXBlT3B0aW9uQ29uc3Q7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yeU9wdGlvbiA9IGdlbmVyYXRlRW51bU9wdGlvbihQcm9kdWN0Q2F0ZWdvcnlFbnVtKTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IEdlbmVyYWxJbmZvcm1hdGlvbldBTWVzc2FnZVZhbGlkYXRpb25Db25zdDtcclxuICAgICAgICB0aGlzLm1hcHMgPSB7XHJcbiAgICAgICAgICAgIHpvb206IDE1LFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogbnVsbCxcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBudWxsLFxyXG4gICAgICAgICAgICBpc0RyYWdnYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgaXNEb3VibGVDbGlja1pvb206IHRydWUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdERpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmluaXRFZGl0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0VmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZ2V0QWNjb3VudE9wdGlvblNlcnZpY2UoXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0/Lm1lZGl1bSA9PT0gJ1dBJ1xyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy5mcm9tPy5uYW1lXHJcbiAgICAgICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmxpc3RlbkJvZHlDaGFuZ2UoKTtcclxuICAgICAgICAvKiB0aGlzLnNldEN1cnJlbnRMb2NhdGlvbigpOyAqL1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRDYW1wYWlnblN0b3JhZ2UoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RlbGluLmNhbXBhaWduJylcclxuICAgICAgICAgICAgPyBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0ZWxpbi5jYW1wYWlnbicpKVxyXG4gICAgICAgICAgICA6IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEZvcm0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgIGNoYW5uZWw6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgbWVkaWE6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgZnJvbTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICB0ZXh0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHRhcmdldFVSTDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmaWxlVHlwZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmaWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBwYXJhbUhlYWRlcjogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHBhcmFtQm9keTogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHBhcmFtQnV0dG9uOiBuZXcgRm9ybUFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgb3RwVmFsdWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIGlzVXBsb2FkOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICBmaWxlSWQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHByb2R1Y3Q6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgY2F0YWxvZ3VlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGJvZHk6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgaXNVc2VFeGlzdGluZ1RlbXBsYXRlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICBpc05lZWRTYXZlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICB0dGw6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybS5lbWl0KHRoaXMuZm9ybSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdERpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE9ubHlNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RWRpdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlKS5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8ubWVkaXVtICE9PSAnV0EnXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAuZ2V0KCdjaGFubmVsJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uY2hhbm5lbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnbWVkaWEnKS5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLm1lZGlhKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5mcm9tKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0Jykuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS50ZXh0KTtcclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgndGFyZ2V0VVJMJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGFyZ2V0VVJMKTtcclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgnZmlsZU5hbWUnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLmZpbGVOYW1lID8/XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGFyZ2V0VVJMJykudmFsdWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgndGVtcGxhdGUnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS50ZW1wbGF0ZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ2lzVXBsb2FkJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uaXNVcGxvYWQpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGVJZCcpLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uZmlsZUlkKTtcclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgnb3RwVmFsdWUnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5vdHBWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ2lzVXNlRXhpc3RpbmdUZW1wbGF0ZScpXHJcbiAgICAgICAgICAgIC5zZXRWYWx1ZSghIXRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0/LnRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ2lzTmVlZFNhdmUnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUoISF0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy5pc05lZWRTYXZlKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0dGwnKS5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy50dGwpO1xyXG5cclxuICAgICAgICB0aGlzLmlzSGF2ZVRlbXBsYXRlUGFyYW0gPSB0aGlzLmZvcm0uZ2V0KCdpc1VwbG9hZCcpLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKG51bGwsIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudmFsdWU/Lm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5mb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1trZXldLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0SXNUZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0Jykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNNZWRpYSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtZWRpYScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlTmFtZScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ21lZGlhJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlTmFtZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc0NhdGFsb2d1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2F0ZWdvcnknKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjYXRhbG9ndWUnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwcm9kdWN0Jykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnYm9keScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NhdGVnb3J5JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjYXRhbG9ndWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3Byb2R1Y3QnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2JvZHknKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzVXRpbGl0eSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMjQpXSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAgICAgLmdldCgndHRsJylcclxuICAgICAgICAgICAgICAgIC5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgICAgICAgICAgICBDdXN0b21WYWxpZGF0b3JzLm1pbigzMCwgJ01pbmltdW0gVFRMIDMwJyksXHJcbiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tVmFsaWRhdG9ycy5tYXgoNDMyMDAsICdNYXhpbXVtIFRUTCA0MzIwMCcpLFxyXG4gICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3R0bCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmb3JtUmVzZXQoX2lzTWVkaWFUeXBlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIV9pc01lZGlhVHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtZWRpYScpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZU5hbWUnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RhcmdldFVSTCcpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZVR5cGUnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGUnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xhdGl0dWRlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsb25naXR1ZGUnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjYXRlZ29yeScpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgncHJvZHVjdCcpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnY2F0YWxvZ3VlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdib2R5JykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdvdHBWYWx1ZScpLnJlc2V0KCk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0VmFsaWRhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFBhcmFtKF9uYW1lOiBzdHJpbmcsIF92YWx1ZTogYW55LCBfdHlwZTogc3RyaW5nKTogUGFyYW1ldGVyIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiBfbmFtZSxcclxuICAgICAgICAgICAgdmFsdWU6IF92YWx1ZSxcclxuICAgICAgICAgICAgaW46ICdxdWVyeScsXHJcbiAgICAgICAgICAgIHR5cGU6IF90eXBlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50T3B0aW9uU2VydmljZShmaWx0ZXI6IHN0cmluZyA9ICcnLCBpc0luZmluaXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ0FjY291bnRPcHRpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJMaXN0OiBBcnJheTxQYXJhbWV0ZXI+ID0gW1xyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGFnZU5vJywgdGhpcy5wYWdlTm9BY2NvdW50T3B0aW9uLCAnbnVtYmVyJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdyb3dQZXJQYWdlJywgMjAsICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BsYXRmb3JtJywgJ1dBJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnc3RhdHVzJywgJ0FQUFJPVkVEJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnZmlsdGVyJywgZmlsdGVyLCAnc3RyaW5nJyksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvYWRtaW4vYWNjb3VudCcsICdHRVQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxXaGF0c0FwcEFjY291bnREdG9bXT4pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzcC5kYXRhKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50T3B0aW9uID0gaXNJbmZpbml0ZSA/IFsuLi50aGlzLmFjY291bnRPcHRpb24sIC4uLnJlc3AuZGF0YV0gOiByZXNwLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzSGF2ZU5leHRBY2NvdW50T3B0aW9uID0gcmVzcC5oYXZlTmV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nQWNjb3VudE9wdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGlzdGVuQm9keUNoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgndGV4dCcpXHJcbiAgICAgICAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDEwMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRJc1V0aWxpdHkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUZXh0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdmFsaWRhdGVUZXh0KGFjY291bnQ/OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzQ2hlY2tVdGlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCB7IGZyb20sIHRleHQgfSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICBpZiAoIXRleHQgJiYgIWZyb20pIHJldHVybjtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgICAgICAgLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0ZWxpbi5hY2Nlc3NUb2tlbicpKVxyXG4gICAgICAgICAgICAuc2V0KCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xyXG4gICAgICAgIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAgICAgICAucG9zdChcclxuICAgICAgICAgICAgICAgIGAke2Vudmlyb25tZW50LmFwaX0vbWVzc2FnZS9kaXJlY3Qtc2VuZC8keyhmcm9tIHx8IGFjY291bnQpPy5pZH1gLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB7IGJvZHk6IHRleHQgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7IGhlYWRlcnMgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXRpbGl0eSA9IHJlc3BvbnNlPy5jYXRlZ29yeSA9PT0gJ1VUSUxJVFknO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDaGVja1V0aWxpdHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDaGVja1V0aWxpdHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZU9wdGlvblNlcnZpY2UoXHJcbiAgICAgICAgZXZlbnQ6IHN0cmluZyA9IG51bGwsXHJcbiAgICAgICAgZmlsdGVyOiBzdHJpbmcgPSAnJyxcclxuICAgICAgICBpc0luZmluaXRlOiBib29sZWFuID0gZmFsc2VcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nVGVtcGxhdGVPcHRpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJMaXN0OiBBcnJheTxQYXJhbWV0ZXI+ID0gW1xyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGFnZU5vJywgdGhpcy5wYWdlTm9UZW1wbGF0ZU9wdGlvbiwgJ251bWJlcicpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncm93UGVyUGFnZScsIDIwLCAnbnVtYmVyJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdwbGF0Zm9ybScsICdXQScsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ2ZpbHRlcicsIGZpbHRlciwgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnc3RhdHVzJywgJ0FQUFJPVkVEJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnY2xpZW50SWQnLCB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudmFsdWU/LmNsaWVudElkLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCd3YWJhSWQnLCB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudmFsdWU/LndhYmFJZCA/PyAnJywgJ3N0cmluZycpLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHlNb2RlKSBwYXJhbWV0ZXJMaXN0LnB1c2godGhpcy5pbml0UGFyYW0oJ3N1bW1hcnknLCB0cnVlLCAnc3RyaW5nJykpO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IHRoaXMuZm9ybS52YWx1ZT8uY2hhbm5lbDtcclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSAndXRpbGl0eScpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5wdXNoKHRoaXMuaW5pdFBhcmFtKCdpc0RpcmVjdFNlbmQnLCB0cnVlLCAnc3RyaW5nJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvbWVzc2FnZS90ZW1wbGF0ZScsICdHRVQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxUZW1wbGF0ZVdBTW9kZWxbXT4pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb24gPSBpc0luZmluaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbLi4udGhpcy50ZW1wbGF0ZU9wdGlvbiwgLi4ucmVzcC5kYXRhXVxyXG4gICAgICAgICAgICAgICAgICAgIDogcmVzcC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0hhdmVOZXh0VGVtcGxhdGVPcHRpb24gPSByZXNwLmhhdmVOZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdUZW1wbGF0ZU9wdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZU9wdGlvbj8uZmluZChcclxuICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5JRCA9PT0gdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS52YWx1ZT8uSURcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS5zZXRWYWx1ZSh0ZW1wbGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdpc1VwbG9hZCcpLnZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVEb3dubG9hZENTVih0aGlzLmZvcm0uZ2V0KCdpc1VwbG9hZCcpLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGVtcGxhdGUodGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vicyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGFyYW1ldGVyKGlzQnV0dG9uOiBib29sZWFuID0gZmFsc2UsIHZhbHVlOiBzdHJpbmcgPSAnJyk6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IGlzQnV0dG9uXHJcbiAgICAgICAgICAgID8gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG5ldyBGb3JtQXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIDogbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNSZWFkT25seU1vZGUgfHwgWyckVW5zdWJzY3JpYmVBY2NvdW50J10uaW5jbHVkZXModmFsdWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldFBhcmFtSGVhZGVyKCk6IEZvcm1Hcm91cFtdIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFyYW1IZWFkZXIodmFsdWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcihmYWxzZSwgdmFsdWUpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucHVzaChmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0UGFyYW1Cb2R5KCk6IEZvcm1Hcm91cFtdIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFBhcmFtQm9keSh2YWx1ZTogc3RyaW5nID0gJycpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKGZhbHNlLCB2YWx1ZSk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkucHVzaChmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0QnV0dG9uKCk6IEZvcm1Hcm91cFtdIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UGFyYW1CdXR0b24oaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cFtdIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgICAgICByZXR1cm4gKGZvcm1baW5kZXhdLmdldCgnbmFtZScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFBhcmFtQnV0dG9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIodHJ1ZSk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc1RleHQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RleHQnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0SXNNZWRpYSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykudmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAnbWVkaWEnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0SXNUZW1wbGF0ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykudmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAndGVtcGxhdGUnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0SXNDYXRhbG9ndWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2NhdGFsb2d1ZSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc1V0aWxpdHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3V0aWxpdHknXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dEFjY291bnRCYXRjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNIYXZlTmV4dEFjY291bnRPcHRpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdlTm9BY2NvdW50T3B0aW9uICs9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRBY2NvdW50T3B0aW9uU2VydmljZSgnJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFjY291bnRTZWxlY3RlZERpc3BsYXkoXHJcbiAgICAgICAgYXR0cmlidXRlMTogV2hhdHNBcHBBY2NvdW50RHRvLFxyXG4gICAgICAgIGF0dHJpYnV0ZTI6IFdoYXRzQXBwQWNjb3VudER0b1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlMSAmJiBhdHRyaWJ1dGUyICYmIGF0dHJpYnV0ZTEuaWQgPT0gYXR0cmlidXRlMi5pZFxyXG4gICAgICAgICAgICA/IGAke2F0dHJpYnV0ZTEubmFtZX0gKCR7YXR0cmlidXRlMS5hY2NvdW50Tm99KWBcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dFRlbXBsYXRlQmF0Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSGF2ZU5leHRUZW1wbGF0ZU9wdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnBhZ2VOb1RlbXBsYXRlT3B0aW9uICs9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZU9wdGlvblNlcnZpY2UobnVsbCwgJycsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0ZW1wbGF0ZVNlbGVjdGVkRGlzcGxheShcclxuICAgICAgICBhdHRyaWJ1dGUxOiBUZW1wbGF0ZVdBTW9kZWwsXHJcbiAgICAgICAgYXR0cmlidXRlMjogVGVtcGxhdGVXQU1vZGVsXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGUxICYmIGF0dHJpYnV0ZTIgJiYgYXR0cmlidXRlMS5uYW1lID09IGF0dHJpYnV0ZTIubmFtZVxyXG4gICAgICAgICAgICA/IGAke2F0dHJpYnV0ZTEubmFtZX1gXHJcbiAgICAgICAgICAgIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpbGU6IEZpbGVMaXN0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcztcclxuICAgICAgICBjb25zdCBhY2NlcHQgPSB0aGlzLmV4dEZpbGVBY2NlcHRlZC5zcGxpdCgnLycpO1xyXG4gICAgICAgIGxldCBtYXRjaFR5cGUgPSBhY2NlcHRbMF07XHJcblxyXG4gICAgICAgIGlmIChmaWxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5leHRGaWxlQWNjZXB0ZWQgPT09ICdhcHBsaWNhdGlvbi9wZGYnKSBtYXRjaFR5cGUgPSBhY2NlcHRbMV07XHJcblxyXG4gICAgICAgIGlmICghZmlsZVswXS50eXBlLmluY2x1ZGVzKG1hdGNoVHlwZSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1NvcnJ5LCB0aGUgZmlsZSB5b3UgYXJlIHVwbG9hZGluZyBpcyBub3TCoGFsbG93ZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGVbMF0uc2l6ZSA+IDEwMDAwMDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVcGxvYWQgbWVkaWEgZmFpbGVkLCBtYXggc2l6ZSAxMG1iJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGUnKS5zZXRWYWx1ZShmaWxlWzBdKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlVHlwZScpLnNldFZhbHVlKCdpbWFnZScpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGVOYW1lJykuc2V0VmFsdWUoZmlsZVswXS5uYW1lKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YXJnZXRVUkwnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RhcmdldFVSTCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGVbMF0udHlwZS5pbmRleE9mKCd2aWRlbycpID4gLTEpIHRoaXMuZm9ybS5nZXQoJ2ZpbGVUeXBlJykuc2V0VmFsdWUoJ3ZpZGVvJyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBsb2FkTWVkaWFTZXJ2aWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGxvYWRNZWRpYVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTGlzdDogQXJyYXk8UGFyYW1ldGVyPiA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5nZXQoJ2ZpbGUnKS52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGluOiAnZm9ybURhdGEnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvbWVzc2FnZS9tZWRpYScsICdQT1NUJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcDogQXBwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGFyZ2V0VVJMJykuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YXJnZXRVUkwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YXJnZXRVUkwnKS5zZXRWYWx1ZShyZXNwLmRhdGEudGFyZ2V0VVJMKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGUnKS5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ1VwbG9hZCBtZWRpYSBzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vicyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVdBTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzU2hvd1BhcmFtZXRlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRlbXBsYXRlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuaXNIYXZlVGVtcGxhdGVQYXJhbSA9XHJcbiAgICAgICAgICAgIHRlbXBsYXRlLmhlYWRlci5leGFtcGxlcz8ubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZS5ib2R5LmV4YW1wbGVzPy5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgIHRlbXBsYXRlLmJ1dHRvbnM/Lmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGlmIChbJ2ltYWdlJywgJ3ZpZGVvJywgJ2RvY3VtZW50J10uaW5jbHVkZXModGVtcGxhdGU/LmhlYWRlcj8udHlwZT8udG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgICAgICAuZ2V0KCdmaWxlTmFtZScpXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5maWxlTmFtZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLnRhcmdldFVSTCA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5oZWFkZXIudXJsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgICAgIC5nZXQoJ3RhcmdldFVSTCcpXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS50YXJnZXRVUkwgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaGVhZGVyLnVybFxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZVR5cGVDaGFuZ2UodGVtcGxhdGU/LmhlYWRlcj8udHlwZT8udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5oZWFkZXIuZXhhbXBsZXM/Lmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgICAgICAgICAgOiB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5ib2R5LmV4YW1wbGVzPy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5Jykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICA6IHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5idXR0b25zPy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdvdHBWYWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9ybVN0b3JhZ2UgPSB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtO1xyXG5cclxuICAgICAgICBpZiAodGVtcGxhdGUuY2F0ZWdvcnkgPT09ICdBVVRIRU5USUNBVElPTicpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgICAgICAuZ2V0KCdvdHBWYWx1ZScpXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/Lm90cFZhbHVlID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsuLi4oZm9ybVN0b3JhZ2U/LnRlbXBsYXRlPy5ib2R5Py5leGFtcGxlcyA/PyBbXSldPy5wb3AoKSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdvdHBWYWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRlbXBsYXRlLmhlYWRlci5leGFtcGxlcz8uZm9yRWFjaCgoZWFjaCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRQYXJhbUhlYWRlcihcclxuICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUhlYWRlcj8uW2luZGV4XT8ubmFtZSA/PyBmb3JtU3RvcmFnZT8ucGFyYW1IZWFkZXI/LltpbmRleF0gPz8gJydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGVtcGxhdGUuYm9keS5leGFtcGxlcz8uZm9yRWFjaCgoZWFjaCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHBhcmFtVmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQm9keT8uW2luZGV4XT8ubmFtZSA/PyBmb3JtU3RvcmFnZT8ucGFyYW1Cb2R5Py5baW5kZXhdID8/ICcnO1xyXG5cclxuICAgICAgICAgICAgaWYgKFsnJFVuc3Vic2NyaWJlQWNjb3VudCddLmluY2x1ZGVzKGVhY2gpKSBwYXJhbVZhbHVlID0gZWFjaDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUGFyYW1Cb2R5KHBhcmFtVmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5idXR0b25zPy5mb3JFYWNoKChlYWNoLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcmFtQnV0dG9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVhY2guZXhhbXBsZXM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGVhY2guZXhhbXBsZXMuZm9yRWFjaCgoXywgcGFyYW1JbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3JtID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVhY2gudHlwZSA9PT0gJ0ZMT1cnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoZmFsc2UsIGVhY2guZmxvd19pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3dQYXJhbWV0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1CdXR0b24/LltpbmRleF0/Lm5hbWU/LltwYXJhbUluZGV4XT8ubmFtZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJ1dHRvbj8uW2luZGV4XT8ubmFtZT8uW3BhcmFtSW5kZXhdID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQnV0dG9uPy5baW5kZXhdPy5bcGFyYW1JbmRleF0gPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0uZ2V0KCduYW1lJykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25bYnV0dG9uLmxlbmd0aCAtIDFdLmdldCgnbmFtZScpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uW2J1dHRvbi5sZW5ndGggLSAxXS5nZXQoJ25hbWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlTWVkaWFUeXBlKF9tZWRpYVR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChfbWVkaWFUeXBlID09PSBFbnVtRGF0YS5NRURJQV9UWVBFX0xPQ0FUSU9OKSB0aGlzLmluaXRNYXBzO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1SZXNldCh0cnVlKTtcclxuICAgICAgICB0aGlzLmZpbGVUeXBlQ2hhbmdlKF9tZWRpYVR5cGUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaWxlVHlwZUNoYW5nZSh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmV4dEZpbGVBY2NlcHRlZCA9ICdpbWFnZS8qJztcclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09IEVudW1EYXRhLk1FRElBX1RZUEVfVklERU8udG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dEZpbGVBY2NlcHRlZCA9ICd2aWRlby8qJztcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEVudW1EYXRhLk1FRElBX1RZUEVfRE9DVU1FTlQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dEZpbGVBY2NlcHRlZCA9ICdhcHBsaWNhdGlvbi9wZGYnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2VhcmNoKHNlYXJjaFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhZ2VOb1RlbXBsYXRlT3B0aW9uID0gMTtcclxuICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZShudWxsLCBzZWFyY2hWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNlYXJjaEFjY291bnQoc2VhcmNoVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFnZU5vQWNjb3VudE9wdGlvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRBY2NvdW50T3B0aW9uU2VydmljZShzZWFyY2hWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TWFwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1hcHNBUElMb2FkZXIubG9hZCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRMb2NhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZW9Db2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xyXG4gICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMubWFwU2VhcmNoUmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlLmFkZExpc3RlbmVyKCdwbGFjZV9jaGFuZ2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZTogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0ID0gYXV0b2NvbXBsZXRlLmdldFBsYWNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxhY2UuZ2VvbWV0cnkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBzLmxhdGl0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBzLmxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xhdGl0dWRlJykuc2V0VmFsdWUodGhpcy5tYXBzLmxhdGl0dWRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsb25naXR1ZGUnKS5zZXRWYWx1ZSh0aGlzLm1hcHMubG9uZ2l0dWRlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEN1cnJlbnRMb2NhdGlvbigpIHtcclxuICAgICAgICBpZiAoJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3IpIHtcclxuICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3JtLmdldCgnbG9uZ2l0dWRlJykudmFsdWUgJiYgIXRoaXMuZm9ybS5nZXQoJ2xhdGl0dWRlJykudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHMubGF0aXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBzLmxvbmdpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbGF0aXR1ZGUnKS5zZXRWYWx1ZSh0aGlzLm1hcHMubGF0aXR1ZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xvbmdpdHVkZScpLnNldFZhbHVlKHRoaXMubWFwcy5sb25naXR1ZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hcmtlckRyYWdFbmQoZXZlbnQ6IGdvb2dsZS5tYXBzLk1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQubGF0TG5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwcy5sYXRpdHVkZSA9IGV2ZW50LmxhdExuZy5sYXQoKTtcclxuICAgICAgICAgICAgdGhpcy5tYXBzLmxvbmdpdHVkZSA9IGV2ZW50LmxhdExuZy5sbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbGF0aXR1ZGUnKS5zZXRWYWx1ZSh0aGlzLm1hcHMubGF0aXR1ZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsb25naXR1ZGUnKS5zZXRWYWx1ZSh0aGlzLm1hcHMubG9uZ2l0dWRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZURvd25sb2FkQ1NWKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2lzVXBsb2FkJykuc2V0VmFsdWUoaXNDaGVja2VkKTtcclxuXHJcbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdvdHBWYWx1ZScpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdvdHBWYWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZSh0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2hhbmdlVGVtcGxhdGUodXNlRXhpc3Rpbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodXNlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0JykucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0Jykuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgoMTAyNCldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2hhbmdlRnJvbSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBpc1VzZUV4aXN0aW5nVGVtcGxhdGUgfSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICBpZiAoaXNVc2VFeGlzdGluZ1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlVGV4dCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoZWFjaCkgPT4gZWFjaC51bnN1YnNjcmliZSgpKTtcclxuICAgIH1cclxufVxyXG4iXX0=
757
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRsZmUvY2FtcGFpZ24tbWFuYWdlbWVudC1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2NhbXBhaWduLW1hbmFnZW1lbnQvbW9kdWxlcy9uZXctY2FtcGFpZ24vY29tcG9uZW50cy9nZW5lcmFsLWluZm9ybWF0aW9uLXdhL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekUsT0FBTyxFQUNILDBDQUEwQyxFQUMxQyxvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3ZCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7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LDRCQUE0QjtZQUN0Qyx3bG9DQUFzRDs7U0FFekQsQ0FBQztPQUNXLDZCQUE2QixDQWl5QnpDO0lBQUQsb0NBQUM7Q0FBQSxBQWp5QkQsSUFpeUJDO1NBanlCWSw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXBzQVBJTG9hZGVyIH0gZnJvbSAnQGFnbS9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge1xyXG4gICAgR2VuZXJhbEluZm9ybWF0aW9uV0FNZXNzYWdlVmFsaWRhdGlvbkNvbnN0LFxyXG4gICAgTWVkaWFUeXBlT3B0aW9uQ29uc3QsXHJcbiAgICBNc2dUeXBlV0FPcHRpb25Db25zdCxcclxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL2NvbnN0JztcclxuaW1wb3J0IHsgUHJvZHVjdENhdGVnb3J5RW51bSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvZW51bXMnO1xyXG5pbXBvcnQgeyBCYXNlT3B0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3V0aWwvYXBpLWFkYXB0ZXItc2VydmljZS1tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcHBSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3V0aWwvYXBpLWR0by9yZXNwb25zZS1tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcGlBZGFwdGVyU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVFbnVtT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS91dGlsJztcclxuaW1wb3J0IHsgVGVtcGxhdGVXQU1vZGVsLCBXaGF0c0FwcEFjY291bnREdG8gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBFbnVtRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWwvZW51bXMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzIGFzIEN1c3RvbVZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi8uLi8uLi92YWxpZGF0b3JzJztcclxuXHJcbmludGVyZmFjZSBJTWFwcyB7XHJcbiAgICB6b29tOiBudW1iZXI7XHJcbiAgICBsYXRpdHVkZTogbnVtYmVyO1xyXG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XHJcbiAgICBpc0RyYWdnYWJsZTogYm9vbGVhbjtcclxuICAgIGlzRG91YmxlQ2xpY2tab29tOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWdlbmVyYWwtaW5mb3JtYXRpb24td2EnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuZXJhbEluZm9ybWF0aW9uV0FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyB1cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtOiBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPjtcclxuXHJcbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIG1zZ1R5cGVXQU9wdGlvbjogYW55W10gPSBbXTtcclxuICAgIHB1YmxpYyBtZWRpYVR5cGVPcHRpb246IGFueVtdID0gW107XHJcbiAgICBwdWJsaWMgY2F0ZWdvcnlPcHRpb246IEJhc2VPcHRpb25Nb2RlbFtdO1xyXG4gICAgcHVibGljIGFjY291bnRPcHRpb246IFdoYXRzQXBwQWNjb3VudER0b1tdID0gW107XHJcbiAgICBwdWJsaWMgaXNIYXZlTmV4dEFjY291bnRPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGlzTG9hZGluZ0FjY291bnRPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyB0ZW1wbGF0ZU9wdGlvbjogVGVtcGxhdGVXQU1vZGVsW10gPSBbXTtcclxuICAgIHB1YmxpYyBpc0hhdmVOZXh0VGVtcGxhdGVPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGlzTG9hZGluZ1RlbXBsYXRlT3B0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNIYXZlVGVtcGxhdGVQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGlzU2hvd1BhcmFtZXRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHZhbGlkYXRpb25NZXNzYWdlczogYW55O1xyXG4gICAgcHVibGljIGV4dEZpbGVBY2NlcHRlZDogc3RyaW5nID0gJ2ltYWdlLyonO1xyXG4gICAgcHVibGljIG1hcHM6IElNYXBzO1xyXG5cclxuICAgIHByaXZhdGUgcGFnZU5vQWNjb3VudE9wdGlvbjogbnVtYmVyID0gMTtcclxuICAgIHByaXZhdGUgcGFnZU5vVGVtcGxhdGVPcHRpb246IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIHN1YnNjcmliZXJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBnZW9Db2RlcjogYW55O1xyXG5cclxuICAgIHB1YmxpYyB0ZW1wbGF0ZXMgPSBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0NyZWF0ZSBOZXcnLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgICAgICB7IGxhYmVsOiAnVXNlIGV4aXN0aW5nIHRlbXBsYXRlJywgdmFsdWU6IHRydWUgfSxcclxuICAgIF07XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVhZE9ubHlNb2RlOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgaXNUb3VjaGVkRm9ybShzdGF0dXM6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIXRoaXMudXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtLmVtaXQodGhpcy5mb3JtKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkKCdtYXBTZWFyY2gnKSBtYXBTZWFyY2hSZWY6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgcHVibGljIGlzVXRpbGl0eTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgaXNDaGVja1V0aWxpdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgICAgIHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcclxuICAgICAgICBwcml2YXRlIGFwaUFkYXB0ZXJTZXJ2aWNlOiBBcGlBZGFwdGVyU2VydmljZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tc2dUeXBlV0FPcHRpb24gPSBNc2dUeXBlV0FPcHRpb25Db25zdDtcclxuICAgICAgICB0aGlzLm1lZGlhVHlwZU9wdGlvbiA9IE1lZGlhVHlwZU9wdGlvbkNvbnN0O1xyXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlPcHRpb24gPSBnZW5lcmF0ZUVudW1PcHRpb24oUHJvZHVjdENhdGVnb3J5RW51bSk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBHZW5lcmFsSW5mb3JtYXRpb25XQU1lc3NhZ2VWYWxpZGF0aW9uQ29uc3Q7XHJcbiAgICAgICAgdGhpcy5tYXBzID0ge1xyXG4gICAgICAgICAgICB6b29tOiAxNSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogbnVsbCxcclxuICAgICAgICAgICAgaXNEcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGlzRG91YmxlQ2xpY2tab29tOiB0cnVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgICAgICB0aGlzLmluaXREaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0RWRpdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFZhbGlkYXRpb24oKTtcclxuICAgICAgICB0aGlzLmdldEFjY291bnRPcHRpb25TZXJ2aWNlKFxyXG4gICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy5tZWRpdW0gPT09ICdXQSdcclxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8uZnJvbT8ubmFtZVxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5Cb2R5Q2hhbmdlKCk7XHJcbiAgICAgICAgLyogdGhpcy5zZXRDdXJyZW50TG9jYXRpb24oKTsgKi9cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0Q2FtcGFpZ25TdG9yYWdlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0ZWxpbi5jYW1wYWlnbicpXHJcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGVsaW4uY2FtcGFpZ24nKSlcclxuICAgICAgICAgICAgOiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICBjaGFubmVsOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIG1lZGlhOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGZyb206IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgdGV4dDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICB0YXJnZXRVUkw6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgZmlsZVR5cGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgZmlsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgcGFyYW1IZWFkZXI6IG5ldyBGb3JtQXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICBwYXJhbUJvZHk6IG5ldyBGb3JtQXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICBwYXJhbUJ1dHRvbjogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIG90cFZhbHVlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxyXG4gICAgICAgICAgICBpc1VwbG9hZDogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcclxuICAgICAgICAgICAgZmlsZUlkOiBuZXcgRm9ybUNvbnRyb2woJycpLFxyXG4gICAgICAgICAgICBjYXRlZ29yeTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBwcm9kdWN0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGNhdGFsb2d1ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBib2R5OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGlzVXNlRXhpc3RpbmdUZW1wbGF0ZTogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcclxuICAgICAgICAgICAgaXNOZWVkU2F2ZTogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcclxuICAgICAgICAgICAgdHRsOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0uZW1pdCh0aGlzLmZvcm0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXREaXNhYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1JlYWRPbmx5TW9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvcm0uZGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEVkaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmdldENhbXBhaWduU3RvcmFnZSkubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0/Lm1lZGl1bSAhPT0gJ1dBJ1xyXG4gICAgICAgIClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgLmdldCgnY2hhbm5lbCcpXHJcbiAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLmNoYW5uZWwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ21lZGlhJykuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5tZWRpYSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uZnJvbSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGV4dCk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ3RhcmdldFVSTCcpXHJcbiAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLnRhcmdldFVSTCk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ2ZpbGVOYW1lJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5maWxlTmFtZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RhcmdldFVSTCcpLnZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ3RlbXBsYXRlJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGVtcGxhdGUpO1xyXG4gICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAuZ2V0KCdpc1VwbG9hZCcpXHJcbiAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLmlzVXBsb2FkKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlSWQnKS5zZXRWYWx1ZSh0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLmZpbGVJZCk7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ290cFZhbHVlJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0ub3RwVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAuZ2V0KCdpc1VzZUV4aXN0aW5nVGVtcGxhdGUnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUoISF0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy50ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAuZ2V0KCdpc05lZWRTYXZlJylcclxuICAgICAgICAgICAgLnNldFZhbHVlKCEhdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8uaXNOZWVkU2F2ZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndHRsJykuc2V0VmFsdWUodGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8udHRsKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0hhdmVUZW1wbGF0ZVBhcmFtID0gdGhpcy5mb3JtLmdldCgnaXNVcGxvYWQnKS52YWx1ZTtcclxuICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZShudWxsLCB0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpLnZhbHVlPy5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWYWxpZGF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZm9ybS5jb250cm9scykge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldElzVGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzTWVkaWEpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbWVkaWEnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZU5hbWUnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdtZWRpYScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZU5hbWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Zyb20nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNDYXRhbG9ndWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NhdGVnb3J5Jykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2F0YWxvZ3VlJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncHJvZHVjdCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2JvZHknKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCkpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjYXRlZ29yeScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2F0YWxvZ3VlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwcm9kdWN0JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdib2R5JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc1V0aWxpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDI0KV0pO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1cclxuICAgICAgICAgICAgICAgIC5nZXQoJ3R0bCcpXHJcbiAgICAgICAgICAgICAgICAuc2V0VmFsaWRhdG9ycyhbXHJcbiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tVmFsaWRhdG9ycy5taW4oMzAsICdNaW5pbXVtIFRUTCAzMCcpLFxyXG4gICAgICAgICAgICAgICAgICAgIEN1c3RvbVZhbGlkYXRvcnMubWF4KDQzMjAwLCAnTWF4aW11bSBUVEwgNDMyMDAnKSxcclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0dGwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnZnJvbScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZm9ybVJlc2V0KF9pc01lZGlhVHlwZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFfaXNNZWRpYVR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbWVkaWEnKS5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmcm9tJykucmVzZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGVOYW1lJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YXJnZXRVUkwnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2ZpbGVUeXBlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsYXRpdHVkZScpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnbG9uZ2l0dWRlJykucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnY2F0ZWdvcnknKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3Byb2R1Y3QnKS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NhdGFsb2d1ZScpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnYm9keScpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5yZXNldCgpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFZhbGlkYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQYXJhbShfbmFtZTogc3RyaW5nLCBfdmFsdWU6IGFueSwgX3R5cGU6IHN0cmluZyk6IFBhcmFtZXRlciB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmFtZTogX25hbWUsXHJcbiAgICAgICAgICAgIHZhbHVlOiBfdmFsdWUsXHJcbiAgICAgICAgICAgIGluOiAncXVlcnknLFxyXG4gICAgICAgICAgICB0eXBlOiBfdHlwZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0QWNjb3VudE9wdGlvblNlcnZpY2UoZmlsdGVyOiBzdHJpbmcgPSAnJywgaXNJbmZpbml0ZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdBY2NvdW50T3B0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTGlzdDogQXJyYXk8UGFyYW1ldGVyPiA9IFtcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BhZ2VObycsIHRoaXMucGFnZU5vQWNjb3VudE9wdGlvbiwgJ251bWJlcicpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncm93UGVyUGFnZScsIDIwLCAnbnVtYmVyJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdwbGF0Zm9ybScsICdXQScsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3N0YXR1cycsICdBUFBST1ZFRCcsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ2ZpbHRlcicsIGZpbHRlciwgJ3N0cmluZycpLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmFwaUFkYXB0ZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5leGVjdXRlQXBpUmVxdWVzdChwYXJhbWV0ZXJMaXN0LCAnL2FkbWluL2FjY291bnQnLCAnR0VUJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcDogQXBwUmVzcG9uc2U8V2hhdHNBcHBBY2NvdW50RHRvW10+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3AuZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudE9wdGlvbiA9IGlzSW5maW5pdGUgPyBbLi4udGhpcy5hY2NvdW50T3B0aW9uLCAuLi5yZXNwLmRhdGFdIDogcmVzcC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0hhdmVOZXh0QWNjb3VudE9wdGlvbiA9IHJlc3AuaGF2ZU5leHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZ0FjY291bnRPcHRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxpc3RlbkJvZHlDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgIC5nZXQoJ3RleHQnKVxyXG4gICAgICAgICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgxMDAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0SXNVdGlsaXR5KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVGV4dCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbGlkYXRlVGV4dChhY2NvdW50PzogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0NoZWNrVXRpbGl0eSA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgeyBmcm9tLCB0ZXh0IH0gPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgaWYgKCF0ZXh0IHx8ICFmcm9tKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICghZnJvbT8uZGlyZWN0U2VuZEVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXHJcbiAgICAgICAgICAgIC5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGVsaW4uYWNjZXNzVG9rZW4nKSlcclxuICAgICAgICAgICAgLnNldCgnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKTtcclxuICAgICAgICB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgICAgICAgLnBvc3QoXHJcbiAgICAgICAgICAgICAgICBgJHtlbnZpcm9ubWVudC5hcGl9L21lc3NhZ2UvZGlyZWN0LXNlbmQvJHsoZnJvbSB8fCBhY2NvdW50KT8uaWR9YCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogeyBib2R5OiB0ZXh0IH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgeyBoZWFkZXJzIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1V0aWxpdHkgPSByZXNwb25zZT8uY2F0ZWdvcnkgPT09ICdVVElMSVRZJztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2hlY2tVdGlsaXR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2hlY2tVdGlsaXR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKFxyXG4gICAgICAgIGV2ZW50OiBzdHJpbmcgPSBudWxsLFxyXG4gICAgICAgIGZpbHRlcjogc3RyaW5nID0gJycsXHJcbiAgICAgICAgaXNJbmZpbml0ZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ1RlbXBsYXRlT3B0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTGlzdDogQXJyYXk8UGFyYW1ldGVyPiA9IFtcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BhZ2VObycsIHRoaXMucGFnZU5vVGVtcGxhdGVPcHRpb24sICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3Jvd1BlclBhZ2UnLCAyMCwgJ251bWJlcicpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGxhdGZvcm0nLCAnV0EnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdmaWx0ZXInLCBmaWx0ZXIsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3N0YXR1cycsICdBUFBST1ZFRCcsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ2NsaWVudElkJywgdGhpcy5mb3JtLmdldCgnZnJvbScpLnZhbHVlPy5jbGllbnRJZCwgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnd2FiYUlkJywgdGhpcy5mb3JtLmdldCgnZnJvbScpLnZhbHVlPy53YWJhSWQgPz8gJycsICdzdHJpbmcnKSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1JlYWRPbmx5TW9kZSkgcGFyYW1ldGVyTGlzdC5wdXNoKHRoaXMuaW5pdFBhcmFtKCdzdW1tYXJ5JywgdHJ1ZSwgJ3N0cmluZycpKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSB0aGlzLmZvcm0udmFsdWU/LmNoYW5uZWw7XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gJ3V0aWxpdHknKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckxpc3QucHVzaCh0aGlzLmluaXRQYXJhbSgnaXNEaXJlY3RTZW5kJywgdHJ1ZSwgJ3N0cmluZycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmFwaUFkYXB0ZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5leGVjdXRlQXBpUmVxdWVzdChwYXJhbWV0ZXJMaXN0LCAnL21lc3NhZ2UvdGVtcGxhdGUnLCAnR0VUJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcDogQXBwUmVzcG9uc2U8VGVtcGxhdGVXQU1vZGVsW10+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9uID0gaXNJbmZpbml0ZVxyXG4gICAgICAgICAgICAgICAgICAgID8gWy4uLnRoaXMudGVtcGxhdGVPcHRpb24sIC4uLnJlc3AuZGF0YV1cclxuICAgICAgICAgICAgICAgICAgICA6IHJlc3AuZGF0YTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIYXZlTmV4dFRlbXBsYXRlT3B0aW9uID0gcmVzcC5oYXZlTmV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nVGVtcGxhdGVPcHRpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVPcHRpb24/LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQuSUQgPT09IHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudmFsdWU/LklEXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykuc2V0VmFsdWUodGVtcGxhdGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmdldCgnaXNVcGxvYWQnKS52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRG93bmxvYWRDU1YodGhpcy5mb3JtLmdldCgnaXNVcGxvYWQnKS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlKHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFBhcmFtZXRlcihpc0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlLCB2YWx1ZTogc3RyaW5nID0gJycpOiBGb3JtR3JvdXAge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSBpc0J1dHRvblxyXG4gICAgICAgICAgICA/IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICA6IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlIHx8IFsnJFVuc3Vic2NyaWJlQWNjb3VudCddLmluY2x1ZGVzKHZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRQYXJhbUhlYWRlcigpOiBGb3JtR3JvdXBbXSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFBhcmFtSGVhZGVyKHZhbHVlOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoZmFsc2UsIHZhbHVlKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLnB1c2goZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldFBhcmFtQm9keSgpOiBGb3JtR3JvdXBbXSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRQYXJhbUJvZHkodmFsdWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcihmYWxzZSwgdmFsdWUpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnB1c2goZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldEJ1dHRvbigpOiBGb3JtR3JvdXBbXSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBhcmFtQnV0dG9uKGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXBbXSB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9ICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICAgICAgcmV0dXJuIChmb3JtW2luZGV4XS5nZXQoJ25hbWUnKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRQYXJhbUJ1dHRvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKHRydWUpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkucHVzaChmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0SXNUZXh0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykudmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICd0ZXh0J1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzTWVkaWEoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ21lZGlhJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzVGVtcGxhdGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnY2hhbm5lbCcpLnZhbHVlICYmXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RlbXBsYXRlJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzQ2F0YWxvZ3VlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykudmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICdjYXRhbG9ndWUnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0SXNVdGlsaXR5KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2NoYW5uZWwnKS52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdjaGFubmVsJykudmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICd1dGlsaXR5J1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5leHRBY2NvdW50QmF0Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSGF2ZU5leHRBY2NvdW50T3B0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMucGFnZU5vQWNjb3VudE9wdGlvbiArPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0QWNjb3VudE9wdGlvblNlcnZpY2UoJycsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhY2NvdW50U2VsZWN0ZWREaXNwbGF5KFxyXG4gICAgICAgIGF0dHJpYnV0ZTE6IFdoYXRzQXBwQWNjb3VudER0byxcclxuICAgICAgICBhdHRyaWJ1dGUyOiBXaGF0c0FwcEFjY291bnREdG9cclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTEgJiYgYXR0cmlidXRlMiAmJiBhdHRyaWJ1dGUxLmlkID09IGF0dHJpYnV0ZTIuaWRcclxuICAgICAgICAgICAgPyBgJHthdHRyaWJ1dGUxLm5hbWV9ICgke2F0dHJpYnV0ZTEuYWNjb3VudE5vfSlgXHJcbiAgICAgICAgICAgIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5leHRUZW1wbGF0ZUJhdGNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0hhdmVOZXh0VGVtcGxhdGVPcHRpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdlTm9UZW1wbGF0ZU9wdGlvbiArPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKG51bGwsICcnLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdGVtcGxhdGVTZWxlY3RlZERpc3BsYXkoXHJcbiAgICAgICAgYXR0cmlidXRlMTogVGVtcGxhdGVXQU1vZGVsLFxyXG4gICAgICAgIGF0dHJpYnV0ZTI6IFRlbXBsYXRlV0FNb2RlbFxyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlMSAmJiBhdHRyaWJ1dGUyICYmIGF0dHJpYnV0ZTEubmFtZSA9PSBhdHRyaWJ1dGUyLm5hbWVcclxuICAgICAgICAgICAgPyBgJHthdHRyaWJ1dGUxLm5hbWV9YFxyXG4gICAgICAgICAgICA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBmaWxlOiBGaWxlTGlzdCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXM7XHJcbiAgICAgICAgY29uc3QgYWNjZXB0ID0gdGhpcy5leHRGaWxlQWNjZXB0ZWQuc3BsaXQoJy8nKTtcclxuICAgICAgICBsZXQgbWF0Y2hUeXBlID0gYWNjZXB0WzBdO1xyXG5cclxuICAgICAgICBpZiAoZmlsZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXh0RmlsZUFjY2VwdGVkID09PSAnYXBwbGljYXRpb24vcGRmJykgbWF0Y2hUeXBlID0gYWNjZXB0WzFdO1xyXG5cclxuICAgICAgICBpZiAoIWZpbGVbMF0udHlwZS5pbmNsdWRlcyhtYXRjaFR5cGUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdTb3JyeSwgdGhlIGZpbGUgeW91IGFyZSB1cGxvYWRpbmcgaXMgbm90wqBhbGxvd2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmaWxlWzBdLnNpemUgPiAxMDAwMDAwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVXBsb2FkIG1lZGlhIGZhaWxlZCwgbWF4IHNpemUgMTBtYicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlJykuc2V0VmFsdWUoZmlsZVswXSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZmlsZVR5cGUnKS5zZXRWYWx1ZSgnaW1hZ2UnKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlTmFtZScpLnNldFZhbHVlKGZpbGVbMF0ubmFtZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndGFyZ2V0VVJMJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YXJnZXRVUkwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmIChmaWxlWzBdLnR5cGUuaW5kZXhPZigndmlkZW8nKSA+IC0xKSB0aGlzLmZvcm0uZ2V0KCdmaWxlVHlwZScpLnNldFZhbHVlKCd2aWRlbycpO1xyXG5cclxuICAgICAgICB0aGlzLnVwbG9hZE1lZGlhU2VydmljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBsb2FkTWVkaWFTZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckxpc3Q6IEFycmF5PFBhcmFtZXRlcj4gPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdmaWxlJyxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uZ2V0KCdmaWxlJykudmFsdWUsXHJcbiAgICAgICAgICAgICAgICBpbjogJ2Zvcm1EYXRhJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmFwaUFkYXB0ZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5leGVjdXRlQXBpUmVxdWVzdChwYXJhbWV0ZXJMaXN0LCAnL21lc3NhZ2UvbWVkaWEnLCAnUE9TVCcpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3A6IEFwcFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RhcmdldFVSTCcpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGFyZ2V0VVJMJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGFyZ2V0VVJMJykuc2V0VmFsdWUocmVzcC5kYXRhLnRhcmdldFVSTCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdmaWxlJykucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKCdVcGxvYWQgbWVkaWEgc3VjY2VzcycpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVXQU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dQYXJhbWV0ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmlzSGF2ZVRlbXBsYXRlUGFyYW0gPVxyXG4gICAgICAgICAgICB0ZW1wbGF0ZS5oZWFkZXIuZXhhbXBsZXM/Lmxlbmd0aCA+IDAgfHxcclxuICAgICAgICAgICAgdGVtcGxhdGUuYm9keS5leGFtcGxlcz8ubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZS5idXR0b25zPy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBpZiAoWydpbWFnZScsICd2aWRlbycsICdkb2N1bWVudCddLmluY2x1ZGVzKHRlbXBsYXRlPy5oZWFkZXI/LnR5cGU/LnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAgICAgLmdldCgnZmlsZU5hbWUnKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uZmlsZU5hbWUgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS50YXJnZXRVUkwgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaGVhZGVyLnVybFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtXHJcbiAgICAgICAgICAgICAgICAuZ2V0KCd0YXJnZXRVUkwnKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGFyZ2V0VVJMID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmhlYWRlci51cmxcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbGVUeXBlQ2hhbmdlKHRlbXBsYXRlPy5oZWFkZXI/LnR5cGU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGVtcGxhdGUuaGVhZGVyLmV4YW1wbGVzPy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgdGVtcGxhdGUuYm9keS5leGFtcGxlcz8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgICAgICAgICAgOiB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgdGVtcGxhdGUuYnV0dG9ucz8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICA6IHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykuY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ290cFZhbHVlJykuc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ290cFZhbHVlJykuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcm1TdG9yYWdlID0gdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlLmNhdGVnb3J5ID09PSAnQVVUSEVOVElDQVRJT04nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVxyXG4gICAgICAgICAgICAgICAgLmdldCgnb3RwVmFsdWUnKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5vdHBWYWx1ZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbLi4uKGZvcm1TdG9yYWdlPy50ZW1wbGF0ZT8uYm9keT8uZXhhbXBsZXMgPz8gW10pXT8ucG9wKCkgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgJydcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ290cFZhbHVlJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5oZWFkZXIuZXhhbXBsZXM/LmZvckVhY2goKGVhY2gsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkUGFyYW1IZWFkZXIoXHJcbiAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1IZWFkZXI/LltpbmRleF0/Lm5hbWUgPz8gZm9ybVN0b3JhZ2U/LnBhcmFtSGVhZGVyPy5baW5kZXhdID8/ICcnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRlbXBsYXRlLmJvZHkuZXhhbXBsZXM/LmZvckVhY2goKGVhY2gsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbVZhbHVlID1cclxuICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJvZHk/LltpbmRleF0/Lm5hbWUgPz8gZm9ybVN0b3JhZ2U/LnBhcmFtQm9keT8uW2luZGV4XSA/PyAnJztcclxuXHJcbiAgICAgICAgICAgIGlmIChbJyRVbnN1YnNjcmliZUFjY291bnQnXS5pbmNsdWRlcyhlYWNoKSkgcGFyYW1WYWx1ZSA9IGVhY2g7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcmFtQm9keShwYXJhbVZhbHVlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGVtcGxhdGUuYnV0dG9ucz8uZm9yRWFjaCgoZWFjaCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRQYXJhbUJ1dHRvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbjtcclxuXHJcbiAgICAgICAgICAgIGlmIChlYWNoLmV4YW1wbGVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlYWNoLmV4YW1wbGVzLmZvckVhY2goKF8sIHBhcmFtSW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlYWNoLnR5cGUgPT09ICdGTE9XJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKGZhbHNlLCBlYWNoLmZsb3dfaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTaG93UGFyYW1ldGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQnV0dG9uPy5baW5kZXhdPy5uYW1lPy5bcGFyYW1JbmRleF0/Lm5hbWUgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1CdXR0b24/LltpbmRleF0/Lm5hbWU/LltwYXJhbUluZGV4XSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJ1dHRvbj8uW2luZGV4XT8uW3BhcmFtSW5kZXhdID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIChidXR0b25bYnV0dG9uLmxlbmd0aCAtIDFdLmdldCgnbmFtZScpIGFzIEZvcm1BcnJheSkucHVzaChmb3JtKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uW2J1dHRvbi5sZW5ndGggLSAxXS5nZXQoJ25hbWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0uZ2V0KCduYW1lJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShfbWVkaWFUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoX21lZGlhVHlwZSA9PT0gRW51bURhdGEuTUVESUFfVFlQRV9MT0NBVElPTikgdGhpcy5pbml0TWFwcztcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtUmVzZXQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5maWxlVHlwZUNoYW5nZShfbWVkaWFUeXBlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsZVR5cGVDaGFuZ2UodHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAnaW1hZ2UvKic7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBFbnVtRGF0YS5NRURJQV9UWVBFX1ZJREVPLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAndmlkZW8vKic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBFbnVtRGF0YS5NRURJQV9UWVBFX0RPQ1VNRU5ULnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAnYXBwbGljYXRpb24vcGRmJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNlYXJjaChzZWFyY2hWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYWdlTm9UZW1wbGF0ZU9wdGlvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZU9wdGlvblNlcnZpY2UobnVsbCwgc2VhcmNoVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTZWFyY2hBY2NvdW50KHNlYXJjaFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhZ2VOb0FjY291bnRPcHRpb24gPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0QWNjb3VudE9wdGlvblNlcnZpY2Uoc2VhcmNoVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdE1hcHMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tYXBzQVBJTG9hZGVyLmxvYWQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50TG9jYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFNlYXJjaFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZS5hZGRMaXN0ZW5lcigncGxhY2VfY2hhbmdlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlLmdlb21ldHJ5KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsYXRpdHVkZScpLnNldFZhbHVlKHRoaXMubWFwcy5sYXRpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbG9uZ2l0dWRlJykuc2V0VmFsdWUodGhpcy5tYXBzLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDdXJyZW50TG9jYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKCdnZW9sb2NhdGlvbicgaW4gbmF2aWdhdG9yKSB7XHJcbiAgICAgICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9ybS5nZXQoJ2xvbmdpdHVkZScpLnZhbHVlICYmICF0aGlzLmZvcm0uZ2V0KCdsYXRpdHVkZScpLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBzLmxhdGl0dWRlID0gcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xhdGl0dWRlJykuc2V0VmFsdWUodGhpcy5tYXBzLmxhdGl0dWRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsb25naXR1ZGUnKS5zZXRWYWx1ZSh0aGlzLm1hcHMubG9uZ2l0dWRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYXJrZXJEcmFnRW5kKGV2ZW50OiBnb29nbGUubWFwcy5Nb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmxhdExuZykge1xyXG4gICAgICAgICAgICB0aGlzLm1hcHMubGF0aXR1ZGUgPSBldmVudC5sYXRMbmcubGF0KCk7XHJcbiAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBldmVudC5sYXRMbmcubG5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xhdGl0dWRlJykuc2V0VmFsdWUodGhpcy5tYXBzLmxhdGl0dWRlKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnbG9uZ2l0dWRlJykuc2V0VmFsdWUodGhpcy5tYXBzLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVEb3dubG9hZENTVihpc0NoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdpc1VwbG9hZCcpLnNldFZhbHVlKGlzQ2hlY2tlZCk7XHJcblxyXG4gICAgICAgIGlmIChpc0NoZWNrZWQpIHtcclxuICAgICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ290cFZhbHVlJykucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgnb3RwVmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlVGVtcGxhdGUodGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUNoYW5nZVRlbXBsYXRlKHVzZUV4aXN0aW5nOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RleHQnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJykucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGVtcGxhdGUnKS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgndGV4dCcpLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4KDEwMjQpXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZXh0JykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUNoYW5nZUZyb20odmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgaXNVc2VFeGlzdGluZ1RlbXBsYXRlIH0gPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgaWYgKGlzVXNlRXhpc3RpbmdUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZSh2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVRleHQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGVhY2gpID0+IGVhY2gudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbn1cclxuIl19