ngx-file-required
Version:
Angular input file required directive
236 lines (228 loc) • 18.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms')) :
typeof define === 'function' && define.amd ? define('ngx-file-required', ['exports', '@angular/core', '@angular/forms'], factory) :
(factory((global['ngx-file-required'] = {}),global.ng.core,global.ng.forms));
}(this, (function (exports,core,forms) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxFileRequiredDirective = (function () {
function NgxFileRequiredDirective(element) {
this.requiredErrorMsg = 'File is required';
this._required = false;
this._multiple = false;
this._element = element;
}
Object.defineProperty(NgxFileRequiredDirective.prototype, "required", {
get: /**
* @return {?}
*/ function () {
return this._required || this._element.nativeElement.hasAttribute('required');
},
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
this._required = value || this._element.nativeElement.hasAttribute('required');
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxFileRequiredDirective.prototype, "multiple", {
get: /**
* @return {?}
*/ function () {
return this._element.nativeElement.hasAttribute('multiple');
},
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
this._multiple = value === '' || !!value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this._mutationObserver = new MutationObserver(function (mutations) {
_this._setValidity(_this._getInputValue(/** @type {?} */ (_this._element.nativeElement)));
});
this._mutationObserver.observe(this._element.nativeElement, {
attributes: true,
attributeOldValue: true,
attributeFilter: ['required']
});
};
/**
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._mutationObserver.disconnect();
};
/**
* @param {?} changes
* @return {?}
*/
NgxFileRequiredDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (this.required &&
(changes["requiredErrorMsg"] && !changes["requiredErrorMsg"].firstChange)) {
this._setValidity(this._getInputValue(/** @type {?} */ (this._element.nativeElement)));
}
};
/**
* @param {?} control
* @return {?}
*/
NgxFileRequiredDirective.prototype.validate = /**
* @param {?} control
* @return {?}
*/
function (control) {
if (!this._control) {
this._control = control;
}
if (this._hasError(this._control.value)) {
return /** @type {?} */ ({
required: this.requiredErrorMsg
});
}
};
/**
* @param {?} eventTarget
* @return {?}
*/
NgxFileRequiredDirective.prototype.onChange = /**
* @param {?} eventTarget
* @return {?}
*/
function (eventTarget) {
/** @type {?} */
var value = this._getInputValue(/** @type {?} */ (eventTarget));
this._setValidity(value);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._setValidity = /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var errors = Object.assign({}, this._control.errors);
if (this._hasError(value)) {
errors["required"] = this.requiredErrorMsg;
}
else {
if (this._control.hasError('required')) {
delete errors["required"];
}
}
this._control.setErrors(Object.keys(errors).length ? errors : null);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._hasError = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.required && !this._hasValue(value);
};
/**
* @param {?} value
* @return {?}
*/
NgxFileRequiredDirective.prototype._hasValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.multiple ?
value instanceof FileList && !!value.length :
value instanceof File;
};
/**
* @param {?} eventTarget
* @return {?}
*/
NgxFileRequiredDirective.prototype._getInputValue = /**
* @param {?} eventTarget
* @return {?}
*/
function (eventTarget) {
return this.multiple ? eventTarget.files : eventTarget.files.item(0);
};
NgxFileRequiredDirective.decorators = [
{ type: core.Directive, args: [{
selector: "\n input[type=\"file\"][attr.required][formControlName],\n input[type=\"file\"][attr.required][formControl],\n input[type=\"file\"][attr.required][ngModel],\n input[type=\"file\"][required][formControlName],\n input[type=\"file\"][required][formControl],\n input[type=\"file\"][required][ngModel]\n ",
exportAs: 'ngxFileRequiredDirective',
providers: [
{
provide: forms.NG_VALIDATORS,
useExisting: NgxFileRequiredDirective,
multi: true
}
]
},] },
];
/** @nocollapse */
NgxFileRequiredDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
NgxFileRequiredDirective.propDecorators = {
requiredErrorMsg: [{ type: core.Input }],
multiple: [{ type: core.Input }],
onChange: [{ type: core.HostListener, args: ['change', ['$event.target'],] }]
};
return NgxFileRequiredDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxFileRequiredModule = (function () {
function NgxFileRequiredModule() {
}
NgxFileRequiredModule.decorators = [
{ type: core.NgModule, args: [{
imports: [],
declarations: [NgxFileRequiredDirective],
exports: [NgxFileRequiredDirective]
},] },
];
return NgxFileRequiredModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.NgxFileRequiredDirective = NgxFileRequiredDirective;
exports.NgxFileRequiredModule = NgxFileRequiredModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpbGUtcmVxdWlyZWQudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtZmlsZS1yZXF1aXJlZC9saWIvbmd4LWZpbGUtcmVxdWlyZWQuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZmlsZS1yZXF1aXJlZC9saWIvbmd4LWZpbGUtcmVxdWlyZWQubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTElEQVRPUlMsXG4gIFZhbGlkYXRvcixcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IHR5cGUgSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSA9IGFueSB8IGJvb2xlYW47XG5pbnRlcmZhY2UgRmlsZUlucHV0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGZpbGVzOiBGaWxlTGlzdDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBgXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVthdHRyLnJlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bYXR0ci5yZXF1aXJlZF1bbmdNb2RlbF0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sXG4gICAgaW5wdXRbdHlwZT1cImZpbGVcIl1bcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpbnB1dFt0eXBlPVwiZmlsZVwiXVtyZXF1aXJlZF1bbmdNb2RlbF1cbiAgYCxcbiAgZXhwb3J0QXM6ICAnbmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlLFxuICAgICAgbXVsdGk6ICAgICAgIHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IEhUTUxGaWxlSW5wdXRBdHRyaWJ1dGUge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuICB9XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWUgfHwgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXF1aXJlZEVycm9yTXNnID0gJ0ZpbGUgaXMgcmVxdWlyZWQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbXVsdGlwbGUoKTogSFRNTEZpbGVJbnB1dEF0dHJpYnV0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJyk7XG4gIH1cblxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHZhbHVlOiBIVE1MRmlsZUlucHV0QXR0cmlidXRlKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZSA9PT0gJycgfHwgISF2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIF9tdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuX3NldFZhbGlkaXR5KHRoaXMuX2dldElucHV0VmFsdWUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEZpbGVJbnB1dEV2ZW50VGFyZ2V0KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsncmVxdWlyZWQnXVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAoY2hhbmdlcy5yZXF1aXJlZEVycm9yTXNnICYmICFjaGFuZ2VzLnJlcXVpcmVkRXJyb3JNc2cuZmlyc3RDaGFuZ2UpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRWYWxpZGl0eSh0aGlzLl9nZXRJbnB1dFZhbHVlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNFcnJvcih0aGlzLl9jb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWRFcnJvck1zZ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3JzO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwdWJsaWMgb25DaGFuZ2UoZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkID0gdGhpcy5fZ2V0SW5wdXRWYWx1ZShldmVudFRhcmdldCBhcyBGaWxlSW5wdXRFdmVudFRhcmdldCk7XG4gICAgdGhpcy5fc2V0VmFsaWRpdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VmFsaWRpdHkodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29udHJvbC5lcnJvcnMpO1xuXG4gICAgaWYgKHRoaXMuX2hhc0Vycm9yKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZEVycm9yTXNnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICBkZWxldGUgZXJyb3JzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID8gZXJyb3JzIDogbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9oYXNFcnJvcih2YWx1ZTogRmlsZXxGaWxlTGlzdHx1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5faGFzVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFzVmFsdWUodmFsdWU6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgP1xuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdCAmJiAhIXZhbHVlLmxlbmd0aCA6XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEZpbGU7XG4gIH1cblxuICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKGV2ZW50VGFyZ2V0OiBGaWxlSW5wdXRFdmVudFRhcmdldCk6IEZpbGV8RmlsZUxpc3R8dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IGV2ZW50VGFyZ2V0LmZpbGVzIDogZXZlbnRUYXJnZXQuZmlsZXMuaXRlbSgwKTtcbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4RmlsZVJlcXVpcmVkRGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3gtZmlsZS1yZXF1aXJlZC5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW05neEZpbGVSZXF1aXJlZERpcmVjdGl2ZV0sXG4gIGV4cG9ydHM6IFtOZ3hGaWxlUmVxdWlyZWREaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIE5neEZpbGVSZXF1aXJlZE1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJEaXJlY3RpdmUiLCJOR19WQUxJREFUT1JTIiwiRWxlbWVudFJlZiIsIklucHV0IiwiSG9zdExpc3RlbmVyIiwiTmdNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTswQ0F3RXFCLE9BQW1CO29DQXJCWixrQkFBa0I7NkJBV3hCLEtBQUs7NkJBRUwsS0FBSztZQVN2QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQzs7OEJBL0JmLDhDQUFROzs7O2dCQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs7OzswQkFHNUQsS0FBNkI7Z0JBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7UUFNakYsc0JBQ1csOENBQVE7OztnQkFEbkI7Z0JBRUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDN0Q7Ozs7MEJBRW1CLEtBQTZCO2dCQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQzs7OztXQUgxQzs7OztRQW9CTSwyQ0FBUTs7Ozs7Z0JBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksZ0JBQWdCLENBQUMsVUFBQyxTQUEyQjtvQkFDeEUsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFJLENBQUMsY0FBYyxtQkFBQyxLQUFJLENBQUMsUUFBUSxDQUFDLGFBQXFDLEVBQUMsQ0FBQyxDQUFDO2lCQUM3RixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtvQkFDMUQsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGlCQUFpQixFQUFFLElBQUk7b0JBQ3ZCLGVBQWUsRUFBRSxDQUFDLFVBQVUsQ0FBQztpQkFDOUIsQ0FBQyxDQUFDOzs7OztRQUdFLDhDQUFXOzs7O2dCQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7Ozs7OztRQUcvQiw4Q0FBVzs7OztzQkFBQyxPQUFzQjtnQkFDdkMsSUFDRSxJQUFJLENBQUMsUUFBUTtxQkFDWixPQUFPLHdCQUFxQixDQUFDLE9BQU8scUJBQWtCLFdBQVcsQ0FDcEUsRUFBRTtvQkFDQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLG1CQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBcUMsRUFBQyxDQUFDLENBQUM7aUJBQzdGOzs7Ozs7UUFHSSwyQ0FBUTs7OztzQkFBQyxPQUF3QjtnQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO2lCQUN6QjtnQkFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDdkMseUJBQU87d0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7cUJBQ1osRUFBQztpQkFDdkI7Ozs7OztRQUlJLDJDQUFROzs7O1lBRGYsVUFDZ0IsV0FBd0I7O2dCQUN0QyxJQUFNLEtBQUssR0FBNEIsSUFBSSxDQUFDLGNBQWMsbUJBQUMsV0FBbUMsRUFBQyxDQUFDO2dCQUNoRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFCOzs7OztRQUVPLCtDQUFZOzs7O3NCQUFDLEtBQThCOztnQkFDakQsSUFBTSxNQUFNLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXpFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekIsTUFBTSxlQUFZLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDekM7cUJBQU07b0JBQ0wsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTt3QkFDdEMsT0FBTyxNQUFNLFlBQVMsQ0FBQztxQkFDeEI7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDOzs7Ozs7UUFHOUQsNENBQVM7Ozs7c0JBQUMsS0FBOEI7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7OztRQUd6Qyw0Q0FBUzs7OztzQkFBQyxLQUE4QjtnQkFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUTtvQkFDbEIsS0FBSyxZQUFZLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQzNDLEtBQUssWUFBWSxJQUFJLENBQUM7Ozs7OztRQUdsQixpREFBYzs7OztzQkFBQyxXQUFpQztnQkFDdEQsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7OztvQkExSHhFQSxjQUFTLFNBQUM7d0JBQ1QsUUFBUSxFQUFFLGdVQU9UO3dCQUNELFFBQVEsRUFBRywwQkFBMEI7d0JBQ3JDLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxPQUFPLEVBQU1DLG1CQUFhO2dDQUMxQixXQUFXLEVBQUUsd0JBQXdCO2dDQUNyQyxLQUFLLEVBQVEsSUFBSTs2QkFDbEI7eUJBQ0Y7cUJBQ0Y7Ozs7O3dCQWpDQ0MsZUFBVTs7Ozt1Q0E0Q1RDLFVBQUs7K0JBR0xBLFVBQUs7K0JBNERMQyxpQkFBWSxTQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsQ0FBQzs7dUNBakgzQzs7Ozs7OztBQ0FBOzs7O29CQUdDQyxhQUFRLFNBQUM7d0JBQ1IsT0FBTyxFQUFFLEVBQ1I7d0JBQ0QsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUM7d0JBQ3hDLE9BQU8sRUFBRSxDQUFDLHdCQUF3QixDQUFDO3FCQUNwQzs7b0NBUkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==