UNPKG

@uiowa/uiowa-account

Version:

Angular library to manage MFK and UNI Account output

521 lines (506 loc) 45.2 kB
import { __extends } from 'tslib'; import { Component, Input, Injectable, Output, EventEmitter, ViewChildren, NgModule } from '@angular/core'; import { FormControl, FormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { DigitOnlyDirective, DigitOnlyModule } from '@uiowa/digit-only'; import { CommonModule } from '@angular/common'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var Account = /** @class */ (function () { function Account(value, delimiter, elements, defaultString) { if (value === void 0) { value = null; } if (delimiter === void 0) { delimiter = '-'; } if (elements === void 0) { elements = []; } if (defaultString === void 0) { defaultString = 'X'; } this.elements = elements; this.value = value; this.delimiter = delimiter; this.valueAry = this.value.split(this.delimiter); this.defaultString = defaultString; } /** * @param {?} index * @return {?} */ Account.prototype.getElementString = /** * @param {?} index * @return {?} */ function (index) { /** @type {?} */ var value = this.valueAry[index]; if (!value) { /** @type {?} */ var element = this.elements[index]; if (element.isRequired) { for (var i = 1; i <= element.size; i++) { value = value + this.defaultString; } } } return value; }; /** * @param {?} index * @param {?=} leaveOptionalEnd * @return {?} */ Account.prototype.showDelimeter = /** * @param {?} index * @param {?=} leaveOptionalEnd * @return {?} */ function (index, leaveOptionalEnd) { if (leaveOptionalEnd === void 0) { leaveOptionalEnd = false; } if (this.lastElementIsOptionalAndEmpty(index) && !leaveOptionalEnd) { return false; } if (!this.indexIsTheLastElement(index)) { return true; } return false; }; /** * @param {?} index * @return {?} */ Account.prototype.indexIsTheLastElement = /** * @param {?} index * @return {?} */ function (index) { return index === this.elements.length - 1; }; /** * @param {?} index * @return {?} */ Account.prototype.lastElementIsOptionalAndEmpty = /** * @param {?} index * @return {?} */ function (index) { if (index + 2 === this.elements.length) { if (!this.elements[index + 1].isRequired && !this.valueAry[index + 1]) { return true; } } return false; }; return Account; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var Element = /** @class */ (function () { function Element(display, size, webapiproperty, isRequired) { if (size === void 0) { size = 0; } if (webapiproperty === void 0) { webapiproperty = null; } this.display = display; this.size = size; this.webApiProperty = webapiproperty; this.isRequired = isRequired; } return Element; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var FieldOption = /** @class */ (function () { function FieldOption(name, display, defaultValue) { if (defaultValue === void 0) { defaultValue = ''; } this.name = name; this.display = display; this.defaultValue = defaultValue; } return FieldOption; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @template T */ var /** * @template T */ ElementInputBase = /** @class */ (function () { function ElementInputBase(options) { if (options === void 0) { options = {}; } this.value = options.value; this.key = options.key || ''; this.label = options.label || ''; this.required = !!options.required; this.order = options.order === undefined ? 1 : options.order; this.controlType = options.controlType || ''; this.id = options.id || ''; this.size = options.size || 10; this.display = options.display || ''; } return ElementInputBase; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var ElementInputText = /** @class */ (function (_super) { __extends(ElementInputText, _super); function ElementInputText(options) { if (options === void 0) { options = {}; } var _this = _super.call(this, options) || this; _this.controlType = 'textbox'; _this.type = 'string'; _this.type = options['type']; return _this; } return ElementInputText; }(ElementInputBase)); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var ElementInputHidden = /** @class */ (function (_super) { __extends(ElementInputHidden, _super); function ElementInputHidden(options) { if (options === void 0) { options = {}; } var _this = _super.call(this, options) || this; _this.controlType = 'hidden'; _this.type = 'string'; _this.type = options['type']; return _this; } return ElementInputHidden; }(ElementInputBase)); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var AccountStringComponent = /** @class */ (function () { function AccountStringComponent() { this.options = []; this.output = []; } /** * @return {?} */ AccountStringComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.account.elements.forEach(function (element, index) { _this.output.push({ value: _this.getElementOutput(element.webApiProperty, index), display: element.display, showDelimeter: _this.account.showDelimeter(index) }); }); }; /** * @param {?} property * @return {?} */ AccountStringComponent.prototype.getOverrideValue = /** * @param {?} property * @return {?} */ function (property) { /** @type {?} */ var element = this.options.find(function (x) { return x.name === property; }); if (element) { return element.display; } }; /** * @param {?} property * @param {?} index * @return {?} */ AccountStringComponent.prototype.getElementOutput = /** * @param {?} property * @param {?} index * @return {?} */ function (property, index) { if (this.options.length > 0) { /** @type {?} */ var overrideValue = this.getOverrideValue(property); if (overrideValue) { return overrideValue; } } return this.account.getElementString(index); }; AccountStringComponent.decorators = [ { type: Component, args: [{ selector: 'uiowa-account-string', template: "\n <span *ngFor=\"let element of output\" placement=\"bottom\" ngbTooltip=\"{{element.display}}\">{{element.value}}<span\n *ngIf=\"element.showDelimeter\">{{account.delimiter}}</span></span>\n " }] } ]; /** @nocollapse */ AccountStringComponent.ctorParameters = function () { return []; }; AccountStringComponent.propDecorators = { account: [{ type: Input }], options: [{ type: Input }] }; return AccountStringComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var InputControlService = /** @class */ (function () { function InputControlService() { } /** * @param {?} questions * @return {?} */ InputControlService.prototype.toFormGroup = /** * @param {?} questions * @return {?} */ function (questions) { /** @type {?} */ var group = {}; questions.forEach(function (question) { group[question.key] = question.required ? new FormControl(question.value || '', Validators.required) : new FormControl(question.value || ''); }); return new FormGroup(group); }; InputControlService.decorators = [ { type: Injectable } ]; /** @nocollapse */ InputControlService.ctorParameters = function () { return []; }; return InputControlService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var AccountInputComponent = /** @class */ (function () { function AccountInputComponent(inputControlService) { this.inputControlService = inputControlService; this.options = []; this.index = 0; this.accountChange = new EventEmitter(); this.questions = []; } /** * @return {?} */ AccountInputComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.account.elements.forEach(function (element, loopIndex) { if (_this.options.find(function (x) { return x.name === element.webApiProperty; })) { /** @type {?} */ var hiddenOption = _this.options.find(function (x) { return x.name === element.webApiProperty; }); _this.questions.push(new ElementInputHidden({ value: hiddenOption.defaultValue, label: element.display, key: element.webApiProperty + '_' + _this.index, size: element.size, display: hiddenOption.display, id: element.webApiProperty + '_' + _this.index })); } else { _this.questions.push(new ElementInputText({ value: _this.account.getElementString(loopIndex), label: element.display, key: element.webApiProperty + '_' + _this.index, size: element.size, name: element.webApiProperty, id: element.webApiProperty + '_' + _this.index })); } }); this.form = this.inputControlService.toFormGroup(this.questions); this.accountString = this.parse(this.questions, this.account.delimiter); }; /** * @return {?} */ AccountInputComponent.prototype.parseAccount = /** * @return {?} */ function () { return this.parse(this.questions, this.account.delimiter); }; /** * @param {?} questions * @param {?} delimeter * @return {?} */ AccountInputComponent.prototype.parse = /** * @param {?} questions * @param {?} delimeter * @return {?} */ function (questions, delimeter) { var _this = this; /** @type {?} */ var accountString = ''; questions.forEach(function (x, index) { accountString += x.value; if (_this.account.showDelimeter(index, true)) { accountString += delimeter; } }); return accountString; }; /** * @param {?} e * @return {?} */ AccountInputComponent.prototype.paste = /** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var pastedInput = e.clipboardData.getData('text/plain').trim(); e.preventDefault(); if (!pastedInput) { return; } this.pasteAccount(pastedInput.split(this.account.delimiter)); this.accountChange.emit(this.parseAccount()); }; /** * @param {?} input * @return {?} */ AccountInputComponent.prototype.pasteAccount = /** * @param {?} input * @return {?} */ function (input) { var _this = this; input.forEach(function (x, index) { if (index + 1 <= _this.questions.length && !(_this.questions[index].controlType === 'hidden') && !isNaN(+x) && _this.questions[index].size === x.trim().length) { _this.form.controls[_this.questions[index].id].patchValue(x); } }); }; /** * @param {?} e * @return {?} */ AccountInputComponent.prototype.onKeyup = /** * @param {?} e * @return {?} */ function (e) { this.accountChange.emit(this.parseAccount()); if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) { return; // only numbers can trigger auto jump feature. } /** @type {?} */ var currentInputId = e.target['id']; if (this.form.controls[currentInputId].value.length === e.target['maxLength']) { /** @type {?} */ var currentQuestionIndex = this.questions.findIndex(function (x) { return x.key === currentInputId; }); var _loop_1 = function (i) { if (this_1.questions[i].controlType === 'hidden') { return "continue"; } /** @type {?} */ var nextInput = this_1.questions[i]; /** @type {?} */ var nextInputField = this_1.formInputs.find(function (v) { return v.el.nativeElement['id'] === nextInput.key; }); nextInputField.el.nativeElement.focus(); return "break"; }; var this_1 = this; for (var i = currentQuestionIndex + 1; i < this.questions.length; i++) { var state_1 = _loop_1(i); if (state_1 === "break") break; } } }; /** * @param {?} e * @return {?} */ AccountInputComponent.prototype.onKeydown = /** * @param {?} e * @return {?} */ function (e) { if (e.keyCode !== 9) { return; } if (e.target['readOnly']) { return; } while (this.form.controls[e.target['id']].value.length < e.target['maxLength']) { this.form.controls[e.target['id']].patchValue(this.form.controls[e.target['id']].value.concat(0)); } }; AccountInputComponent.decorators = [ { type: Component, args: [{ selector: 'uiowa-account-input', template: "<div id=\"account-container\">\n <form (ngSubmit)=\"null\" [formGroup]=\"form\">\n <div *ngFor=\"let question of questions\" class=\"account-field\" [style.width.rem]=\"question.size + 1\">\n <div [formGroup]=\"form\">\n <label [attr.for]=\"question.id\" class=\"account-field-label\">{{question.label}}</label>\n\n <div [ngSwitch]=\"question.controlType\" [ngClass]=\"{hiddenLabel: question.controlType === 'hidden'}\">\n\n <input *ngSwitchCase=\"'textbox'\" [formControlName]=\"question.key\" [id]=\"question.id\" [type]=\"question.controlType\"\n [attr.maxlength]=\"question.size\" [style.width.rem]=\"question.size+1\" [attr.maxlength]=\"question.size\"\n inputmode=\"numeric\" pattern=\"[0-9]*\" digitOnly class=\"form-control\" (keydown)=\"onKeydown($event)\" (keyup)=\"onKeyup($event)\"\n (paste)=\"paste($event)\">\n <input *ngSwitchCase=\"'hidden'\" [formControlName]=\"question.key\" [id]=\"question.id\" [type]=\"question.controlType\"\n [attr.maxlength]=\"question.size\" [style.width.rem]=\"question.size\">\n <span *ngSwitchCase=\"'hidden'\">{{question.display}}</span>\n </div>\n </div>\n </div>\n </form>\n</div>\n", providers: [InputControlService], styles: [":host{display:inline-flex}.account-field{display:inline-block;vertical-align:bottom;margin-right:.25rem}.account-field .form-control{padding:.375rem!important;text-align:center;font-size:1rem;font-weight:400;font-style:normal;font-variant:normal}label.account-field-label{display:block;font-size:.625rem;margin-bottom:0;text-align:center;white-space:nowrap}div.hiddenLabel{margin-top:7px;text-align:center;padding-bottom:6px}"] }] } ]; /** @nocollapse */ AccountInputComponent.ctorParameters = function () { return [ { type: InputControlService } ]; }; AccountInputComponent.propDecorators = { account: [{ type: Input }], options: [{ type: Input }], index: [{ type: Input }], accountChange: [{ type: Output }], formInputs: [{ type: ViewChildren, args: [DigitOnlyDirective,] }] }; return AccountInputComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var UiowaAccountModule = /** @class */ (function () { function UiowaAccountModule() { } UiowaAccountModule.decorators = [ { type: NgModule, args: [{ imports: [CommonModule, NgbModule, DigitOnlyModule, ReactiveFormsModule, FormsModule], declarations: [AccountStringComponent, AccountInputComponent], exports: [AccountStringComponent, AccountInputComponent] },] } ]; return UiowaAccountModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { AccountStringComponent, UiowaAccountModule, Account, Element, FieldOption, ElementInputText, ElementInputBase, ElementInputHidden, AccountInputComponent as ɵa, InputControlService as ɵb }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlvd2EtdWlvd2EtYWNjb3VudC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQHVpb3dhL3Vpb3dhLWFjY291bnQvbGliL21vZGVscy9hY2NvdW50LnRzIiwibmc6Ly9AdWlvd2EvdWlvd2EtYWNjb3VudC9saWIvbW9kZWxzL2VsZW1lbnQudHMiLCJuZzovL0B1aW93YS91aW93YS1hY2NvdW50L2xpYi9tb2RlbHMvZmllbGQtb3B0aW9uLnRzIiwibmc6Ly9AdWlvd2EvdWlvd2EtYWNjb3VudC9saWIvbW9kZWxzL2VsZW1lbnQtaW5wdXQtYmFzZS50cyIsIm5nOi8vQHVpb3dhL3Vpb3dhLWFjY291bnQvbGliL21vZGVscy9lbGVtZW50LWlucHV0LXRleHQudHMiLCJuZzovL0B1aW93YS91aW93YS1hY2NvdW50L2xpYi9tb2RlbHMvZWxlbWVudC1pbnB1dC1oaWRkZW4udHMiLCJuZzovL0B1aW93YS91aW93YS1hY2NvdW50L2xpYi9hY2NvdW50LXN0cmluZy9hY2NvdW50LXN0cmluZy5jb21wb25lbnQudHMiLCJuZzovL0B1aW93YS91aW93YS1hY2NvdW50L2xpYi9pbnB1dC1jb250cm9sLnNlcnZpY2UudHMiLCJuZzovL0B1aW93YS91aW93YS1hY2NvdW50L2xpYi9hY2NvdW50LWlucHV0L2FjY291bnQtaW5wdXQuY29tcG9uZW50LnRzIiwibmc6Ly9AdWlvd2EvdWlvd2EtYWNjb3VudC9saWIvdWlvd2EtYWNjb3VudC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vZWxlbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBBY2NvdW50IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgZGVsaW1pdGVyOiBzdHJpbmc7XG4gIGVsZW1lbnRzOiBFbGVtZW50W107XG4gIGRlZmF1bHRTdHJpbmc6IHN0cmluZztcblxuICBwcml2YXRlIHZhbHVlQXJ5OiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nID0gbnVsbCwgZGVsaW1pdGVyOiBzdHJpbmcgPSAnLScsIGVsZW1lbnRzOiBFbGVtZW50W10gPSBbXSwgZGVmYXVsdFN0cmluZzogc3RyaW5nID0gJ1gnKSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjtcbiAgICB0aGlzLnZhbHVlQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCh0aGlzLmRlbGltaXRlcik7XG4gICAgdGhpcy5kZWZhdWx0U3RyaW5nID0gZGVmYXVsdFN0cmluZztcbiAgfVxuXG4gIGdldEVsZW1lbnRTdHJpbmcoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZUFyeVtpbmRleF07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgICAgaWYgKGVsZW1lbnQuaXNSZXF1aXJlZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBlbGVtZW50LnNpemU7IGkrKykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyB0aGlzLmRlZmF1bHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2hvd0RlbGltZXRlcihpbmRleDogbnVtYmVyLCBsZWF2ZU9wdGlvbmFsRW5kOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5sYXN0RWxlbWVudElzT3B0aW9uYWxBbmRFbXB0eShpbmRleCkgJiYgIWxlYXZlT3B0aW9uYWxFbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmluZGV4SXNUaGVMYXN0RWxlbWVudChpbmRleCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGluZGV4SXNUaGVMYXN0RWxlbWVudChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLmVsZW1lbnRzLmxlbmd0aCAtIDE7XG4gIH1cblxuICBwcml2YXRlIGxhc3RFbGVtZW50SXNPcHRpb25hbEFuZEVtcHR5KGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoaW5kZXggKyAyID09PSB0aGlzLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmVsZW1lbnRzW2luZGV4ICsgMV0uaXNSZXF1aXJlZCAmJiAhdGhpcy52YWx1ZUFyeVtpbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBFbGVtZW50IHtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIHdlYkFwaVByb3BlcnR5OiBzdHJpbmc7XG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGlzcGxheTogc3RyaW5nLFxuICAgIHNpemU6IG51bWJlciA9IDAsXG4gICAgd2ViYXBpcHJvcGVydHk6IHN0cmluZyA9IG51bGwsXG4gICAgaXNSZXF1aXJlZDogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5O1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgdGhpcy53ZWJBcGlQcm9wZXJ0eSA9IHdlYmFwaXByb3BlcnR5O1xuICAgIHRoaXMuaXNSZXF1aXJlZCA9IGlzUmVxdWlyZWQ7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBGaWVsZE9wdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBkaXNwbGF5OiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnKSB7fVxufVxuIiwiZXhwb3J0IGNsYXNzIEVsZW1lbnRJbnB1dEJhc2U8VD4ge1xuICB2YWx1ZTogVDtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlcXVpcmVkOiBib29sZWFuO1xuICBvcmRlcjogbnVtYmVyO1xuICBjb250cm9sVHlwZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIGRpc3BsYXk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiB7XG4gICAgICB2YWx1ZT86IFQ7XG4gICAgICBrZXk/OiBzdHJpbmc7XG4gICAgICBsYWJlbD86IHN0cmluZztcbiAgICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgICAgIG9yZGVyPzogbnVtYmVyO1xuICAgICAgY29udHJvbFR5cGU/OiBzdHJpbmc7XG4gICAgICBpZD86IHN0cmluZztcbiAgICAgIHNpemU/OiBudW1iZXI7XG4gICAgICBkaXNwbGF5Pzogc3RyaW5nO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB0aGlzLmtleSA9IG9wdGlvbnMua2V5IHx8ICcnO1xuICAgIHRoaXMubGFiZWwgPSBvcHRpb25zLmxhYmVsIHx8ICcnO1xuICAgIHRoaXMucmVxdWlyZWQgPSAhIW9wdGlvbnMucmVxdWlyZWQ7XG4gICAgdGhpcy5vcmRlciA9IG9wdGlvbnMub3JkZXIgPT09IHVuZGVmaW5lZCA/IDEgOiBvcHRpb25zLm9yZGVyO1xuICAgIHRoaXMuY29udHJvbFR5cGUgPSBvcHRpb25zLmNvbnRyb2xUeXBlIHx8ICcnO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkIHx8ICcnO1xuICAgIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB8fCAxMDtcbiAgICB0aGlzLmRpc3BsYXkgPSBvcHRpb25zLmRpc3BsYXkgfHwgJyc7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVsZW1lbnRJbnB1dEJhc2UgfSBmcm9tICcuL2VsZW1lbnQtaW5wdXQtYmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50SW5wdXRUZXh0IGV4dGVuZHMgRWxlbWVudElucHV0QmFzZTxzdHJpbmc+IHtcbiAgY29udHJvbFR5cGUgPSAndGV4dGJveCc7XG4gIHR5cGUgPSAnc3RyaW5nJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7fSA9IHt9KSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy50eXBlID0gb3B0aW9uc1sndHlwZSddO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbGVtZW50SW5wdXRCYXNlIH0gZnJvbSAnLi9lbGVtZW50LWlucHV0LWJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudElucHV0SGlkZGVuIGV4dGVuZHMgRWxlbWVudElucHV0QmFzZTxzdHJpbmc+IHtcbiAgY29udHJvbFR5cGUgPSAnaGlkZGVuJztcbiAgdHlwZSA9ICdzdHJpbmcnO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7fSA9IHt9KSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy50eXBlID0gb3B0aW9uc1sndHlwZSddO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY291bnQsIEZpZWxkT3B0aW9uIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWlvd2EtYWNjb3VudC1zdHJpbmcnLFxuICB0ZW1wbGF0ZTogYFxuICA8c3BhbiAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBvdXRwdXRcIiBwbGFjZW1lbnQ9XCJib3R0b21cIiBuZ2JUb29sdGlwPVwie3tlbGVtZW50LmRpc3BsYXl9fVwiPnt7ZWxlbWVudC52YWx1ZX19PHNwYW5cbiAgICAqbmdJZj1cImVsZW1lbnQuc2hvd0RlbGltZXRlclwiPnt7YWNjb3VudC5kZWxpbWl0ZXJ9fTwvc3Bhbj48L3NwYW4+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQWNjb3VudFN0cmluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIGFjY291bnQ6IEFjY291bnQ7XG4gIEBJbnB1dCgpXG4gIG9wdGlvbnM/OiBGaWVsZE9wdGlvbltdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvdXRwdXQgPSBbXTtcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hY2NvdW50LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLm91dHB1dC5wdXNoKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2V0RWxlbWVudE91dHB1dChlbGVtZW50LndlYkFwaVByb3BlcnR5LCBpbmRleCksXG4gICAgICAgIGRpc3BsYXk6IGVsZW1lbnQuZGlzcGxheSxcbiAgICAgICAgc2hvd0RlbGltZXRlcjogdGhpcy5hY2NvdW50LnNob3dEZWxpbWV0ZXIoaW5kZXgpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3ZlcnJpZGVWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5vcHRpb25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IHByb3BlcnR5KTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZGlzcGxheTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRPdXRwdXQocHJvcGVydHk6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdmVycmlkZVZhbHVlID0gdGhpcy5nZXRPdmVycmlkZVZhbHVlKHByb3BlcnR5KTtcbiAgICAgIGlmIChvdmVycmlkZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hY2NvdW50LmdldEVsZW1lbnRTdHJpbmcoaW5kZXgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBFbGVtZW50SW5wdXRCYXNlIH0gZnJvbSAnLi9tb2RlbHMvZWxlbWVudC1pbnB1dC1iYXNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElucHV0Q29udHJvbFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgdG9Gb3JtR3JvdXAocXVlc3Rpb25zOiBFbGVtZW50SW5wdXRCYXNlPGFueT5bXSkge1xuICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcblxuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKHF1ZXN0aW9uID0+IHtcbiAgICAgIGdyb3VwW3F1ZXN0aW9uLmtleV0gPSBxdWVzdGlvbi5yZXF1aXJlZFxuICAgICAgICA/IG5ldyBGb3JtQ29udHJvbChxdWVzdGlvbi52YWx1ZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgICAgOiBuZXcgRm9ybUNvbnRyb2wocXVlc3Rpb24udmFsdWUgfHwgJycpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGdyb3VwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY291bnQsIEZpZWxkT3B0aW9uLCBFbGVtZW50SW5wdXRCYXNlLCBFbGVtZW50SW5wdXRUZXh0LCBFbGVtZW50SW5wdXRIaWRkZW4gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2lucHV0LWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBEaWdpdE9ubHlEaXJlY3RpdmUgfSBmcm9tICdAdWlvd2EvZGlnaXQtb25seSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Vpb3dhLWFjY291bnQtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWNjb3VudC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FjY291bnQtaW5wdXQuY29tcG9uZW50LmNzcyddLFxuICBwcm92aWRlcnM6IFtJbnB1dENvbnRyb2xTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBBY2NvdW50SW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBhY2NvdW50OiBBY2NvdW50O1xuICBASW5wdXQoKVxuICBvcHRpb25zPzogRmllbGRPcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKVxuICBpbmRleCA9IDA7XG5cbiAgQE91dHB1dCgpXG4gIGFjY291bnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkcmVuKERpZ2l0T25seURpcmVjdGl2ZSlcbiAgZm9ybUlucHV0czogUXVlcnlMaXN0PERpZ2l0T25seURpcmVjdGl2ZT47XG5cbiAgcXVlc3Rpb25zOiBFbGVtZW50SW5wdXRCYXNlPGFueT5bXSA9IFtdO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIGFjY291bnRTdHJpbmc6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlucHV0Q29udHJvbFNlcnZpY2U6IElucHV0Q29udHJvbFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hY2NvdW50LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGxvb3BJbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5maW5kKHggPT4geC5uYW1lID09PSBlbGVtZW50LndlYkFwaVByb3BlcnR5KSkge1xuICAgICAgICBjb25zdCBoaWRkZW5PcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zLnB1c2goXG4gICAgICAgICAgbmV3IEVsZW1lbnRJbnB1dEhpZGRlbih7XG4gICAgICAgICAgICB2YWx1ZTogaGlkZGVuT3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmRpc3BsYXksXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQud2ViQXBpUHJvcGVydHkgKyAnXycgKyB0aGlzLmluZGV4LFxuICAgICAgICAgICAgc2l6ZTogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgZGlzcGxheTogaGlkZGVuT3B0aW9uLmRpc3BsYXksXG4gICAgICAgICAgICBpZDogZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSArICdfJyArIHRoaXMuaW5kZXhcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMucHVzaChcbiAgICAgICAgICBuZXcgRWxlbWVudElucHV0VGV4dCh7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5hY2NvdW50LmdldEVsZW1lbnRTdHJpbmcobG9vcEluZGV4KSxcbiAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmRpc3BsYXksXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQud2ViQXBpUHJvcGVydHkgKyAnXycgKyB0aGlzLmluZGV4LFxuICAgICAgICAgICAgc2l6ZTogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgbmFtZTogZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSxcbiAgICAgICAgICAgIGlkOiBlbGVtZW50LndlYkFwaVByb3BlcnR5ICsgJ18nICsgdGhpcy5pbmRleFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmlucHV0Q29udHJvbFNlcnZpY2UudG9Gb3JtR3JvdXAodGhpcy5xdWVzdGlvbnMpO1xuICAgIHRoaXMuYWNjb3VudFN0cmluZyA9IHRoaXMucGFyc2UodGhpcy5xdWVzdGlvbnMsIHRoaXMuYWNjb3VudC5kZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFjY291bnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSh0aGlzLnF1ZXN0aW9ucywgdGhpcy5hY2NvdW50LmRlbGltaXRlcik7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlKHF1ZXN0aW9uczogRWxlbWVudElucHV0QmFzZTxhbnk+W10sIGRlbGltZXRlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgYWNjb3VudFN0cmluZyA9ICcnO1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKCh4LCBpbmRleCkgPT4ge1xuICAgICAgYWNjb3VudFN0cmluZyArPSB4LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuYWNjb3VudC5zaG93RGVsaW1ldGVyKGluZGV4LCB0cnVlKSkge1xuICAgICAgICBhY2NvdW50U3RyaW5nICs9IGRlbGltZXRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWNjb3VudFN0cmluZztcbiAgfVxuXG4gIHBhc3RlKGU6IENsaXBib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgcGFzdGVkSW5wdXQ6IHN0cmluZyA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykudHJpbSgpO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghcGFzdGVkSW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXN0ZUFjY291bnQocGFzdGVkSW5wdXQuc3BsaXQodGhpcy5hY2NvdW50LmRlbGltaXRlcikpO1xuICAgIHRoaXMuYWNjb3VudENoYW5nZS5lbWl0KHRoaXMucGFyc2VBY2NvdW50KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXN0ZUFjY291bnQoaW5wdXQ6IHN0cmluZ1tdKSB7XG4gICAgaW5wdXQuZm9yRWFjaCgoeCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5kZXggKyAxIDw9IHRoaXMucXVlc3Rpb25zLmxlbmd0aCAmJlxuICAgICAgICAhKHRoaXMucXVlc3Rpb25zW2luZGV4XS5jb250cm9sVHlwZSA9PT0gJ2hpZGRlbicpICYmXG4gICAgICAgICFpc05hTigreCkgJiZcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNbaW5kZXhdLnNpemUgPT09IHgudHJpbSgpLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLnF1ZXN0aW9uc1tpbmRleF0uaWRdLnBhdGNoVmFsdWUoeCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbktleXVwKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmFjY291bnRDaGFuZ2UuZW1pdCh0aGlzLnBhcnNlQWNjb3VudCgpKTtcbiAgICBpZiAoKGUua2V5Q29kZSA8IDQ4IHx8IGUua2V5Q29kZSA+IDU3KSAmJiAoZS5rZXlDb2RlIDwgOTYgfHwgZS5rZXlDb2RlID4gMTA1KSkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IG51bWJlcnMgY2FuIHRyaWdnZXIgYXV0byBqdW1wIGZlYXR1cmUuXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJbnB1dElkID0gZS50YXJnZXRbJ2lkJ107XG4gICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1tjdXJyZW50SW5wdXRJZF0udmFsdWUubGVuZ3RoID09PSBlLnRhcmdldFsnbWF4TGVuZ3RoJ10pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRRdWVzdGlvbkluZGV4ID0gdGhpcy5xdWVzdGlvbnMuZmluZEluZGV4KHggPT4geC5rZXkgPT09IGN1cnJlbnRJbnB1dElkKTtcbiAgICAgIGZvciAobGV0IGkgPSBjdXJyZW50UXVlc3Rpb25JbmRleCArIDE7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbnNbaV0uY29udHJvbFR5cGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dElucHV0ID0gdGhpcy5xdWVzdGlvbnNbaV07XG4gICAgICAgIGNvbnN0IG5leHRJbnB1dEZpZWxkID0gdGhpcy5mb3JtSW5wdXRzLmZpbmQodiA9PiB2LmVsLm5hdGl2ZUVsZW1lbnRbJ2lkJ10gPT09IG5leHRJbnB1dC5rZXkpO1xuICAgICAgICBuZXh0SW5wdXRGaWVsZC5lbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5Q29kZSAhPT0gOSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZS50YXJnZXRbJ3JlYWRPbmx5J10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5mb3JtLmNvbnRyb2xzW2UudGFyZ2V0WydpZCddXS52YWx1ZS5sZW5ndGggPCBlLnRhcmdldFsnbWF4TGVuZ3RoJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tlLnRhcmdldFsnaWQnXV0ucGF0Y2hWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHNbZS50YXJnZXRbJ2lkJ11dLnZhbHVlLmNvbmNhdCgwKSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjY291bnRTdHJpbmdDb21wb25lbnQgfSBmcm9tICcuL2FjY291bnQtc3RyaW5nL2FjY291bnQtc3RyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ2JNb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBBY2NvdW50SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2FjY291bnQtaW5wdXQvYWNjb3VudC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGlnaXRPbmx5TW9kdWxlIH0gZnJvbSAnQHVpb3dhL2RpZ2l0LW9ubHknO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE5nYk1vZHVsZSwgRGlnaXRPbmx5TW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0FjY291bnRTdHJpbmdDb21wb25lbnQsIEFjY291bnRJbnB1dENvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBY2NvdW50U3RyaW5nQ29tcG9uZW50LCBBY2NvdW50SW5wdXRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFVpb3dhQWNjb3VudE1vZHVsZSB7fVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX19leHRlbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBO0lBUUUsaUJBQVksS0FBb0IsRUFBRSxTQUF1QixFQUFFLFFBQXdCLEVBQUUsYUFBMkI7UUFBcEcsc0JBQUEsRUFBQSxZQUFvQjtRQUFFLDBCQUFBLEVBQUEsZUFBdUI7UUFBRSx5QkFBQSxFQUFBLGFBQXdCO1FBQUUsOEJBQUEsRUFBQSxtQkFBMkI7UUFDOUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJ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