angular-mydatepicker
Version:
Angular datepicker and date range picker
1,045 lines • 92.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, ElementRef, ViewContainerRef, Renderer2, ChangeDetectorRef, ComponentFactoryResolver, forwardRef, EventEmitter, Output, HostListener } from "@angular/core";
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from "@angular/forms";
import { CalendarComponent } from "./components/calendar/calendar.component";
import { LocaleService } from "./services/angular-mydatepicker.locale.service";
import { UtilService } from "./services/angular-mydatepicker.util.service";
import { DefaultConfigService } from "./services/angular-mydatepicker.config.service";
import { CalToggle } from "./enums/cal-toggle.enum";
import { Year } from "./enums/year.enum";
import { KeyCode } from "./enums/key-code.enum";
import { CalAnimation } from "./enums/cal-animation.enum";
import { KEYUP, BLUR, EMPTY_STR, DISABLED, CLICK, BODY, VALUE, PREVENT_CLOSE_TIMEOUT, OPTIONS, DEFAULT_MONTH, LOCALE, OBJECT, PX, INNER_HTML, ANIMATION_END, ANIMATION_TIMEOUT } from "./constants/constants";
/** @type {?} */
var NGX_DP_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return AngularMyDatePickerDirective; })),
multi: true
};
/** @type {?} */
var NGX_DP_VALIDATORS = {
provide: NG_VALIDATORS,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return AngularMyDatePickerDirective; })),
multi: true
};
var AngularMyDatePickerDirective = /** @class */ (function () {
function AngularMyDatePickerDirective(localeService, utilService, vcRef, cfr, renderer, cdr, elem, config) {
var _this = this;
this.localeService = localeService;
this.utilService = utilService;
this.vcRef = vcRef;
this.cfr = cfr;
this.renderer = renderer;
this.cdr = cdr;
this.elem = elem;
this.config = config;
this.defaultMonth = { defMonth: EMPTY_STR, overrideSelection: false };
this.dateChanged = new EventEmitter();
this.inputFieldChanged = new EventEmitter();
this.calendarViewChanged = new EventEmitter();
this.calendarToggle = new EventEmitter();
this.rangeDateSelection = new EventEmitter();
this.viewActivated = new EventEmitter();
this.cRef = null;
this.hostText = EMPTY_STR;
this.preventClose = false;
this.disabled = false;
this.selectedValue = null;
this.onChangeCb = (/**
* @return {?}
*/
function () { });
this.onTouchedCb = (/**
* @return {?}
*/
function () { });
this.onClickWrapper = (/**
* @param {?} event
* @return {?}
*/
function (event) { return _this.onClick(event); });
this.onAnimateWrapper = (/**
* @param {?} reason
* @return {?}
*/
function (reason) { return _this.animationEnd(reason); });
this.opts = this.config.getDefaultConfig();
this.parseOptions(this.opts);
}
/**
* @param {?} event
* @return {?}
*/
AngularMyDatePickerDirective.prototype.onKeyUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var keyCode = this.utilService.getKeyCodeFromEvent(event);
if (this.ignoreKeyPress(keyCode)) {
return;
}
if (keyCode === KeyCode.esc) {
this.closeSelector(CalToggle.CloseByEsc);
}
else {
var _a = this.opts, dateRange = _a.dateRange, dateFormat = _a.dateFormat, monthLabels = _a.monthLabels, dateRangeDatesDelimiter = _a.dateRangeDatesDelimiter;
/** @type {?} */
var value = this.getHostValue();
/** @type {?} */
var dateModel = null;
/** @type {?} */
var valid = false;
/** @type {?} */
var validateOpts = null;
if (!dateRange) {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) };
/** @type {?} */
var date = this.utilService.isDateValid(value, this.opts, validateOpts);
valid = this.utilService.isInitializedDate(date);
if (valid) {
dateModel = this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter);
}
}
else {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) };
/** @type {?} */
var range = this.utilService.isDateValidDateRange(value, this.opts, validateOpts);
var begin = range.begin, end = range.end;
valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end);
if (valid) {
dateModel = this.utilService.getDateModel(null, range, dateFormat, monthLabels, dateRangeDatesDelimiter);
}
}
this.onChangeCb(dateModel);
this.emitInputFieldChanged(value, valid);
}
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.onBlur = /**
* @return {?}
*/
function () {
var _a = this.opts, inputFieldValidation = _a.inputFieldValidation, dateRange = _a.dateRange, dateFormat = _a.dateFormat, monthLabels = _a.monthLabels, dateRangeDatesDelimiter = _a.dateRangeDatesDelimiter, closeSelectorOnDateSelect = _a.closeSelectorOnDateSelect;
if (inputFieldValidation) {
/** @type {?} */
var value = this.getHostValue();
/** @type {?} */
var valid = false;
/** @type {?} */
var validateOpts = null;
if (!dateRange) {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) };
/** @type {?} */
var date = this.utilService.isDateValid(value, this.opts, validateOpts);
valid = this.utilService.isInitializedDate(date);
if (valid && this.hostText !== value) {
// Valid date
/** @type {?} */
var dateModel = this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter);
this.emitDateChanged(dateModel);
this.updateModel(dateModel);
if (closeSelectorOnDateSelect) {
this.closeSelector(CalToggle.CloseByDateSel);
}
}
}
else {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) };
/** @type {?} */
var dateRange_1 = this.utilService.isDateValidDateRange(value, this.opts, validateOpts);
var begin = dateRange_1.begin, end = dateRange_1.end;
valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end);
if (valid && this.hostText !== value) {
// Valid date range
/** @type {?} */
var dateModel = this.utilService.getDateModel(null, dateRange_1, dateFormat, monthLabels, dateRangeDatesDelimiter);
this.emitDateChanged(dateModel);
this.updateModel(dateModel);
if (closeSelectorOnDateSelect) {
this.closeSelector(CalToggle.CloseByDateSel);
}
}
}
if (!valid && this.hostText !== value) {
if (value === EMPTY_STR) {
this.clearDate();
}
else {
this.onChangeCb(null);
}
}
this.hostText = value;
}
this.onTouchedCb();
};
/**
* @private
* @param {?} event
* @return {?}
*/
AngularMyDatePickerDirective.prototype.onClick = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
if (this.opts.closeSelectorOnDocumentClick && !this.preventClose && event.target && this.cRef
&& this.elem.nativeElement !== event.target && !this.cRef.location.nativeElement.contains(event.target)
&& !this.disabled) {
this.closeSelector(CalToggle.CloseByOutClick);
}
};
/**
* @param {?} changes
* @return {?}
*/
AngularMyDatePickerDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.hasOwnProperty(LOCALE)) {
this.setLocaleOptions();
}
if (changes.hasOwnProperty(DEFAULT_MONTH)) {
/** @type {?} */
var dm = changes[DEFAULT_MONTH].currentValue;
if (typeof dm === OBJECT) {
if (!dm.overrideSelection) {
dm.overrideSelection = false;
}
}
else {
dm = { defMonth: dm, overrideSelection: false };
}
this.defaultMonth = dm;
}
if (changes.hasOwnProperty(OPTIONS)) {
this.parseOptions(changes[OPTIONS].currentValue);
}
if (this.cRef) {
this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue());
}
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.closeCalendar();
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.setLocaleOptions = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var opts = this.localeService.getLocaleOptions(this.locale);
Object.keys(opts).forEach((/**
* @param {?} k
* @return {?}
*/
function (k) {
((/** @type {?} */ (_this.opts)))[k] = opts[k];
}));
};
/**
* @param {?} opts
* @return {?}
*/
AngularMyDatePickerDirective.prototype.parseOptions = /**
* @param {?} opts
* @return {?}
*/
function (opts) {
var _this = this;
if (opts) {
Object.keys(opts).forEach((/**
* @param {?} k
* @return {?}
*/
function (k) {
((/** @type {?} */ (_this.opts)))[k] = opts[k];
}));
}
var _a = this.opts, minYear = _a.minYear, maxYear = _a.maxYear, openSelectorTopOfInput = _a.openSelectorTopOfInput, inline = _a.inline;
if (minYear < Year.min) {
this.opts.minYear = Year.min;
}
if (maxYear > Year.max) {
this.opts.maxYear = Year.max;
}
if (openSelectorTopOfInput || inline) {
this.opts.showSelectorArrow = false;
}
if (inline) {
this.openCalendar();
}
};
/**
* @param {?} value
* @return {?}
*/
AngularMyDatePickerDirective.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.disabled) {
return;
}
/** @type {?} */
var validateOpts = null;
var _a = this.opts, dateFormat = _a.dateFormat, monthLabels = _a.monthLabels, dateRangeDatesDelimiter = _a.dateRangeDatesDelimiter, inline = _a.inline;
if (!value) {
this.setHostValue(EMPTY_STR);
this.emitInputFieldChanged(EMPTY_STR, false);
if (this.cRef) {
this.cRef.instance.resetDateValue();
}
}
else if (!value.isRange && value.singleDate) {
// single date
var _b = value.singleDate, date = _b.date, jsDate = _b.jsDate;
if (!date) {
date = this.utilService.jsDateToMyDate(jsDate);
}
/** @type {?} */
var formatted = this.utilService.formatDate(date, dateFormat, monthLabels);
validateOpts = { validateDisabledDates: false, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) };
/** @type {?} */
var valid = this.utilService.isInitializedDate(this.utilService.isDateValid(formatted, this.opts, validateOpts));
if (valid) {
this.setHostValue(formatted);
this.emitInputFieldChanged(formatted, valid);
this.setSelectedValue(this.utilService.getDateModel(date, null, dateFormat, monthLabels, dateRangeDatesDelimiter));
if (this.cRef) {
this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue());
}
}
}
else if (value.isRange && value.dateRange) {
// date range
var _c = value.dateRange, beginDate = _c.beginDate, beginJsDate = _c.beginJsDate, endDate = _c.endDate, endJsDate = _c.endJsDate;
if (!beginDate || !endDate) {
beginDate = this.utilService.jsDateToMyDate(beginJsDate);
endDate = this.utilService.jsDateToMyDate(endJsDate);
}
/** @type {?} */
var formatted = this.utilService.formatDate(beginDate, dateFormat, monthLabels) + dateRangeDatesDelimiter +
this.utilService.formatDate(endDate, dateFormat, monthLabels);
validateOpts = { validateDisabledDates: false, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) };
var _d = this.utilService.isDateValidDateRange(formatted, this.opts, validateOpts), begin = _d.begin, end = _d.end;
/** @type {?} */
var valid = this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end);
if (valid) {
this.setHostValue(formatted);
this.emitInputFieldChanged(formatted, valid);
/** @type {?} */
var dateRange = { begin: beginDate, end: endDate };
this.setSelectedValue(this.utilService.getDateModel(null, dateRange, dateFormat, monthLabels, dateRangeDatesDelimiter));
if (this.cRef) {
this.cRef.instance.refreshComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue());
}
}
}
};
/**
* @param {?} fn
* @return {?}
*/
AngularMyDatePickerDirective.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCb = fn;
};
/**
* @param {?} fn
* @return {?}
*/
AngularMyDatePickerDirective.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCb = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
AngularMyDatePickerDirective.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
this.renderer.setProperty(this.elem.nativeElement, DISABLED, isDisabled);
if (isDisabled) {
this.closeCalendar();
}
};
/**
* @param {?} c
* @return {?}
*/
AngularMyDatePickerDirective.prototype.validate = /**
* @param {?} c
* @return {?}
*/
function (c) {
/** @type {?} */
var value = this.getHostValue();
if (value === null || value === EMPTY_STR) {
return null;
}
/** @type {?} */
var validateOpts = null;
if (!this.opts.dateRange) {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) };
/** @type {?} */
var date = this.utilService.isDateValid(value, this.opts, validateOpts);
if (!this.utilService.isInitializedDate(date)) {
return { invalidDateFormat: true };
}
}
else {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) };
var _a = this.utilService.isDateValidDateRange(value, this.opts, validateOpts), begin = _a.begin, end = _a.end;
if (!this.utilService.isInitializedDate(begin) || !this.utilService.isInitializedDate(end)) {
return { invalidDateFormat: true };
}
}
return null;
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.openCalendar = /**
* @return {?}
*/
function () {
var _this = this;
if (this.disabled) {
return;
}
this.preventClose = true;
this.cdr.detectChanges();
if (this.cRef === null) {
this.cRef = this.vcRef.createComponent(this.cfr.resolveComponentFactory(CalendarComponent));
this.appendSelector(this.cRef.location.nativeElement);
this.cRef.instance.initializeComponent(this.opts, this.defaultMonth, this.selectedValue, this.getHostValue(), this.getSelectorPosition(this.elem.nativeElement), (/**
* @param {?} dm
* @param {?} close
* @return {?}
*/
function (dm, close) {
_this.focusToInput();
_this.emitDateChanged(dm);
_this.emitInputFieldChanged(_this.utilService.getFormattedDate(dm), true);
_this.updateModel(dm);
if (close) {
_this.closeSelector(CalToggle.CloseByDateSel);
}
}), (/**
* @param {?} cvc
* @return {?}
*/
function (cvc) {
_this.emitCalendarChanged(cvc);
}), (/**
* @param {?} rds
* @return {?}
*/
function (rds) {
_this.emitRangeDateSelection(rds);
}), (/**
* @param {?} va
* @return {?}
*/
function (va) {
_this.emitViewActivated(va);
}), (/**
* @return {?}
*/
function () {
_this.closeSelector(CalToggle.CloseByEsc);
}));
this.emitCalendarToggle(CalToggle.Open);
if (!this.opts.inline) {
document.addEventListener(CLICK, this.onClickWrapper);
}
}
setTimeout((/**
* @return {?}
*/
function () {
_this.preventClose = false;
}), PREVENT_CLOSE_TIMEOUT);
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.closeCalendar = /**
* @return {?}
*/
function () {
this.closeSelector(CalToggle.CloseByCalBtn);
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.toggleCalendar = /**
* @return {?}
*/
function () {
if (this.disabled) {
return;
}
/** @type {?} */
var isOpen = this.cRef === null;
if (isOpen) {
this.openCalendar();
}
else {
this.closeSelector(CalToggle.CloseByCalBtn);
}
return isOpen;
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.clearDate = /**
* @return {?}
*/
function () {
if (this.disabled) {
return;
}
var inline = this.opts.inline;
this.setHostValue(EMPTY_STR);
this.emitDateChanged({
isRange: this.opts.dateRange,
singleDate: {
date: this.utilService.resetDate(),
jsDate: null,
formatted: EMPTY_STR,
epoc: 0
},
dateRange: {
beginDate: this.utilService.resetDate(),
beginJsDate: null,
beginEpoc: 0,
endDate: this.utilService.resetDate(),
endJsDate: null,
endEpoc: 0,
formatted: EMPTY_STR
}
});
this.onChangeCb(null);
this.onTouchedCb();
if (this.cRef) {
this.cRef.instance.clearDate();
}
if (!inline) {
this.closeSelector(CalToggle.CloseByCalBtn);
}
};
/**
* @return {?}
*/
AngularMyDatePickerDirective.prototype.isDateValid = /**
* @return {?}
*/
function () {
/** @type {?} */
var value = this.getHostValue();
if (value === null || value === EMPTY_STR) {
return false;
}
/** @type {?} */
var validateOpts = null;
if (!this.opts.dateRange) {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, false) };
/** @type {?} */
var date = this.utilService.isDateValid(value, this.opts, validateOpts);
if (this.utilService.isInitializedDate(date)) {
this.emitInputFieldChanged(value, true);
return true;
}
}
else {
validateOpts = { validateDisabledDates: true, selectedValue: this.utilService.getSelectedValue(this.selectedValue, true) };
var _a = this.utilService.isDateValidDateRange(value, this.opts, validateOpts), begin = _a.begin, end = _a.end;
if (this.utilService.isInitializedDate(begin) && this.utilService.isInitializedDate(end)) {
this.emitInputFieldChanged(value, true);
return true;
}
}
this.emitInputFieldChanged(value, false);
return false;
};
/**
* @param {?} headerAction
* @return {?}
*/
AngularMyDatePickerDirective.prototype.headerAction = /**
* @param {?} headerAction
* @return {?}
*/
function (headerAction) {
if (this.cRef) {
this.cRef.instance.headerAction(headerAction);
}
};
/**
* @param {?} value
* @return {?}
*/
AngularMyDatePickerDirective.prototype.setHostValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
var divHostElement = this.opts.divHostElement;
this.hostText = value;
/** @type {?} */
var valueType = !divHostElement.enabled ? VALUE : INNER_HTML;
value = valueType === INNER_HTML && value === EMPTY_STR ? divHostElement.placeholder : value;
this.renderer.setProperty(this.elem.nativeElement, valueType, value);
};
/**
* @private
* @param {?} keyCode
* @return {?}
*/
AngularMyDatePickerDirective.prototype.ignoreKeyPress = /**
* @private
* @param {?} keyCode
* @return {?}
*/
function (keyCode) {
return keyCode === KeyCode.leftArrow || keyCode === KeyCode.rightArrow || keyCode === KeyCode.upArrow || keyCode === KeyCode.downArrow || keyCode === KeyCode.tab || keyCode === KeyCode.shift;
};
/**
* @private
* @param {?} reason
* @return {?}
*/
AngularMyDatePickerDirective.prototype.animationEnd = /**
* @private
* @param {?} reason
* @return {?}
*/
function (reason) {
if (this.cRef) {
this.cRef.instance.selectorEl.nativeElement.removeEventListener(ANIMATION_END, this.onAnimateWrapper);
this.removeComponent();
this.emitCalendarToggle(reason);
}
};
/**
* @private
* @param {?} reason
* @return {?}
*/
AngularMyDatePickerDirective.prototype.closeSelector = /**
* @private
* @param {?} reason
* @return {?}
*/
function (reason) {
var _a = this.opts, inline = _a.inline, calendarAnimation = _a.calendarAnimation;
if (this.cRef && !inline) {
if (calendarAnimation.out !== CalAnimation.None) {
var instance = this.cRef.instance;
instance.selectorEl.nativeElement.addEventListener(ANIMATION_END, this.onAnimateWrapper.bind(this, reason));
instance.setCalendarAnimation(calendarAnimation, false);
// In case the animationend event is not fired
setTimeout(this.onAnimateWrapper.bind(this, reason), ANIMATION_TIMEOUT);
}
else {
this.removeComponent();
this.emitCalendarToggle(reason);
}
document.removeEventListener(CLICK, this.onClickWrapper);
}
};
/**
* @private
* @return {?}
*/
AngularMyDatePickerDirective.prototype.removeComponent = /**
* @private
* @return {?}
*/
function () {
if (this.vcRef !== null) {
this.vcRef.remove(this.vcRef.indexOf(this.cRef.hostView));
this.cRef = null;
}
};
/**
* @private
* @param {?} model
* @return {?}
*/
AngularMyDatePickerDirective.prototype.updateModel = /**
* @private
* @param {?} model
* @return {?}
*/
function (model) {
this.setHostValue(this.utilService.getFormattedDate(model));
this.onChangeCb(model);
this.onTouchedCb();
};
/**
* @private
* @return {?}
*/
AngularMyDatePickerDirective.prototype.getHostValue = /**
* @private
* @return {?}
*/
function () {
var _a = this.elem.nativeElement, value = _a.value, innerHTML = _a.innerHTML;
return !this.opts.divHostElement.enabled ? value : innerHTML;
};
/**
* @private
* @return {?}
*/
AngularMyDatePickerDirective.prototype.focusToInput = /**
* @private
* @return {?}
*/
function () {
var _this = this;
var _a = this.opts, focusInputOnDateSelect = _a.focusInputOnDateSelect, divHostElement = _a.divHostElement;
if (focusInputOnDateSelect && !divHostElement.enabled) {
setTimeout((/**
* @return {?}
*/
function () {
_this.elem.nativeElement.focus();
}));
}
};
/**
* @private
* @param {?} dateModel
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitDateChanged = /**
* @private
* @param {?} dateModel
* @return {?}
*/
function (dateModel) {
this.dateChanged.emit(dateModel);
this.setSelectedValue(dateModel);
};
/**
* @private
* @param {?} dateModel
* @return {?}
*/
AngularMyDatePickerDirective.prototype.setSelectedValue = /**
* @private
* @param {?} dateModel
* @return {?}
*/
function (dateModel) {
var isRange = dateModel.isRange, dateRange = dateModel.dateRange, singleDate = dateModel.singleDate;
this.selectedValue = isRange ? dateRange : singleDate;
};
/**
* @private
* @param {?} value
* @param {?} valid
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitInputFieldChanged = /**
* @private
* @param {?} value
* @param {?} valid
* @return {?}
*/
function (value, valid) {
this.inputFieldChanged.emit({ value: value, dateFormat: this.opts.dateFormat, valid: valid });
};
/**
* @private
* @param {?} cvc
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitCalendarChanged = /**
* @private
* @param {?} cvc
* @return {?}
*/
function (cvc) {
this.calendarViewChanged.emit(cvc);
};
/**
* @private
* @param {?} rds
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitRangeDateSelection = /**
* @private
* @param {?} rds
* @return {?}
*/
function (rds) {
this.rangeDateSelection.emit(rds);
};
/**
* @private
* @param {?} va
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitViewActivated = /**
* @private
* @param {?} va
* @return {?}
*/
function (va) {
this.viewActivated.emit(va);
};
/**
* @private
* @param {?} reason
* @return {?}
*/
AngularMyDatePickerDirective.prototype.emitCalendarToggle = /**
* @private
* @param {?} reason
* @return {?}
*/
function (reason) {
this.calendarToggle.emit(reason);
};
/**
* @private
* @param {?} elem
* @return {?}
*/
AngularMyDatePickerDirective.prototype.appendSelector = /**
* @private
* @param {?} elem
* @return {?}
*/
function (elem) {
if (this.opts.appendSelectorToBody) {
document.querySelector(BODY).appendChild(elem);
}
};
/**
* @private
* @param {?} elem
* @return {?}
*/
AngularMyDatePickerDirective.prototype.getSelectorPosition = /**
* @private
* @param {?} elem
* @return {?}
*/
function (elem) {
/** @type {?} */
var top = 0;
/** @type {?} */
var left = 0;
var _a = this.opts, appendSelectorToBody = _a.appendSelectorToBody, openSelectorTopOfInput = _a.openSelectorTopOfInput, selectorHeight = _a.selectorHeight, selectorWidth = _a.selectorWidth, showSelectorArrow = _a.showSelectorArrow, alignSelectorRight = _a.alignSelectorRight;
if (appendSelectorToBody) {
/** @type {?} */
var b = document.body.getBoundingClientRect();
/** @type {?} */
var e = elem.getBoundingClientRect();
top = e.top - b.top;
left = e.left - b.left;
}
if (openSelectorTopOfInput) {
top = top - this.getSelectorDimension(selectorHeight) - 2;
}
else {
top = top + elem.offsetHeight + (showSelectorArrow ? 12 : 2);
}
if (alignSelectorRight) {
left = left + elem.offsetWidth - this.getSelectorDimension(selectorWidth);
}
return { top: top + PX, left: left + PX };
};
/**
* @private
* @param {?} value
* @return {?}
*/
AngularMyDatePickerDirective.prototype.getSelectorDimension = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
return Number(value.replace(PX, EMPTY_STR));
};
AngularMyDatePickerDirective.decorators = [
{ type: Directive, args: [{
selector: "[angular-mydatepicker]",
exportAs: "angular-mydatepicker",
providers: [UtilService, LocaleService, DefaultConfigService, NGX_DP_VALUE_ACCESSOR, NGX_DP_VALIDATORS]
},] }
];
/** @nocollapse */
AngularMyDatePickerDirective.ctorParameters = function () { return [
{ type: LocaleService },
{ type: UtilService },
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: Renderer2 },
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: DefaultConfigService }
]; };
AngularMyDatePickerDirective.propDecorators = {
options: [{ type: Input }],
locale: [{ type: Input }],
defaultMonth: [{ type: Input }],
dateChanged: [{ type: Output }],
inputFieldChanged: [{ type: Output }],
calendarViewChanged: [{ type: Output }],
calendarToggle: [{ type: Output }],
rangeDateSelection: [{ type: Output }],
viewActivated: [{ type: Output }],
onKeyUp: [{ type: HostListener, args: [KEYUP, ["$event"],] }],
onBlur: [{ type: HostListener, args: [BLUR,] }]
};
return AngularMyDatePickerDirective;
}());
export { AngularMyDatePickerDirective };
if (false) {
/** @type {?} */
AngularMyDatePickerDirective.prototype.options;
/** @type {?} */
AngularMyDatePickerDirective.prototype.locale;
/** @type {?} */
AngularMyDatePickerDirective.prototype.defaultMonth;
/** @type {?} */
AngularMyDatePickerDirective.prototype.dateChanged;
/** @type {?} */
AngularMyDatePickerDirective.prototype.inputFieldChanged;
/** @type {?} */
AngularMyDatePickerDirective.prototype.calendarViewChanged;
/** @type {?} */
AngularMyDatePickerDirective.prototype.calendarToggle;
/** @type {?} */
AngularMyDatePickerDirective.prototype.rangeDateSelection;
/** @type {?} */
AngularMyDatePickerDirective.prototype.viewActivated;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.cRef;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.hostText;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.preventClose;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.disabled;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.selectedValue;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.opts;
/** @type {?} */
AngularMyDatePickerDirective.prototype.onChangeCb;
/** @type {?} */
AngularMyDatePickerDirective.prototype.onTouchedCb;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.onClickWrapper;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.onAnimateWrapper;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.localeService;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.utilService;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.vcRef;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.cfr;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.cdr;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.elem;
/**
* @type {?}
* @private
*/
AngularMyDatePickerDirective.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1teWRhdGVwaWNrZXIuaW5wdXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW15ZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLW15ZGF0ZXBpY2tlci5pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQWdCLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQ2hHLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUE0QixZQUFZLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDdEksT0FBTyxFQUF3QyxhQUFhLEVBQUUsaUJBQWlCLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQVczRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDN0UsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCxPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQ3pHLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7SUFFM0YscUJBQXFCLEdBQUc7SUFDNUIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsY0FBTSxPQUFBLDRCQUE0QixFQUE1QixDQUE0QixFQUFDO0lBQzNELEtBQUssRUFBRSxJQUFJO0NBQ1o7O0lBRUssaUJBQWlCLEdBQUc7SUFDeEIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLGNBQU0sT0FBQSw0QkFBNEIsRUFBNUIsQ0FBNEIsRUFBQztJQUMzRCxLQUFLLEVBQUUsSUFBSTtDQUNaO0FBRUQ7SUE0QkUsc0NBQW9CLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3hCLEtBQXVCLEVBQ3ZCLEdBQTZCLEVBQzdCLFFBQW1CLEVBQ25CLEdBQXNCLEVBQ3RCLElBQWdCLEVBQ2hCLE1BQTRCO1FBUGhELGlCQVVDO1FBVm1CLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQTBCO1FBQzdCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQTNCdkMsaUJBQVksR0FBb0IsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBQyxDQUFDO1FBRS9FLGdCQUFXLEdBQStCLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQzNFLHNCQUFpQixHQUF1QyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUNqRyx3QkFBbUIsR0FBeUMsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFDdkcsbUJBQWMsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNsRSx1QkFBa0IsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDcEcsa0JBQWEsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUUzRSxTQUFJLEdBQW9DLElBQUksQ0FBQztRQUM3QyxhQUFRLEdBQVcsU0FBUyxDQUFDO1FBQzdCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsa0JBQWEsR0FBUSxJQUFJLENBQUM7UUFJbEMsZUFBVTs7O1FBQXFCLGNBQVEsQ0FBQyxFQUFDO1FBQ3pDLGdCQUFXOzs7UUFBZSxjQUFRLENBQUMsRUFBQztRQTBHNUIsbUJBQWM7Ozs7UUFBRyxVQUFDLEtBQVUsSUFBSyxPQUFBLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQW5CLENBQW1CLEVBQUM7UUErVXJELHFCQUFnQjs7OztRQUFHLFVBQUMsTUFBYyxJQUFLLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBekIsQ0FBeUIsRUFBQztRQS9hdkUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7Ozs7SUFFZ0MsOENBQU87Ozs7SUFBeEMsVUFBeUMsS0FBVTs7WUFDM0MsT0FBTyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFDO2FBQ0k7WUFDRyxJQUFBLGNBQXlFLEVBQXhFLHdCQUFTLEVBQUUsMEJBQVUsRUFBRSw0QkFBVyxFQUFFLG9EQUFvQzs7Z0JBQ3pFLEtBQUssR0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFOztnQkFFckMsU0FBUyxHQUFpQixJQUFJOztnQkFDOUIsS0FBSyxHQUFZLEtBQUs7O2dCQUN0QixZQUFZLEdBQXVCLElBQUk7WUFDM0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDZCxZQUFZLEdBQUcsRUFBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBQyxDQUFDOztvQkFDcEgsSUFBSSxHQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztnQkFDbEYsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksS0FBSyxFQUFFO29CQUNULFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztpQkFDekc7YUFDRjtpQkFDSTtnQkFDSCxZQUFZLEdBQUcsRUFBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDOztvQkFDbkgsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO2dCQUM1RSxJQUFBLG1CQUFLLEVBQUUsZUFBRztnQkFDakIsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0YsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2lCQUMxRzthQUNGO1lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQzs7OztJQUVtQiw2Q0FBTTs7O0lBQTFCO1FBQ1EsSUFBQSxjQUEwSCxFQUF6SCw4Q0FBb0IsRUFBRSx3QkFBUyxFQUFFLDBCQUFVLEVBQUUsNEJBQVcsRUFBRSxvREFBdUIsRUFBRSx3REFBc0M7UUFFaEksSUFBSSxvQkFBb0IsRUFBRTs7Z0JBQ2xCLEtBQUssR0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFOztnQkFFckMsS0FBSyxHQUFZLEtBQUs7O2dCQUN0QixZQUFZLEdBQXVCLElBQUk7WUFDM0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDZCxZQUFZLEdBQUcsRUFBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBQyxDQUFDOztvQkFDcEgsSUFBSSxHQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztnQkFDbEYsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFOzs7d0JBRTlCLFNBQVMsR0FBaUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixDQUFDO29CQUMzSCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1QixJQUFJLHlCQUF5QixFQUFFO3dCQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDOUM7aUJBQ0Y7YUFDRjtpQkFDSTtnQkFDSCxZQUFZLEdBQUcsRUFBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDOztvQkFDbkgsV0FBUyxHQUFpQixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztnQkFDOUYsSUFBQSx5QkFBSyxFQUFFLHFCQUFHO2dCQUNqQixLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTs7O3dCQUU5QixTQUFTLEdBQWlCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsQ0FBQztvQkFDaEksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDNUIsSUFBSSx5QkFBeUIsRUFBRTt3QkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQzlDO2lCQUNGO2FBQ0Y7WUFFRCxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO2dCQUNyQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDbEI7cUJBQ0k7b0JBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkI7YUFDRjtZQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7OztJQUlPLDhDQUFPOzs7OztJQUFmLFVBQWdCLEtBQVU7UUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJO2VBQ3RGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7ZUFDcEcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQzs7Ozs7SUFFTSxrREFBVzs7OztJQUFsQixVQUFtQixPQUFzQjtRQUN2QyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUU7O2dCQUNyQyxFQUFFLEdBQVEsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVk7WUFDakQsSUFBSSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3pCLEVBQUUsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7aUJBQzlCO2FBQ0Y7aUJBQ0k7Z0JBQ0gsRUFBRSxHQUFHLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUMsQ0FBQzthQUMvQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDNUc7SUFDSCxDQUFDOzs7O0lBRU0sa0RBQVc7OztJQUFsQjtRQUNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7O0lBRU0sdURBQWdCOzs7SUFBdkI7UUFBQSxpQkFLQzs7WUFKTyxJQUFJLEdBQWUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsQ0FBQztZQUMxQixDQUFDLG1CQUFhLEtBQUksQ0FBQyxJQUFJLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRU0sbURBQVk7Ozs7SUFBbkIsVUFBb0IsSUFBZ0I7UUFBcEMsaUJBd0JDO1FBdkJDLElBQUksSUFBSSxFQUFFO1lBQ1IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQyxDQUFDO2dCQUMxQixDQUFDLG1CQUFhLEtBQUksQ0FBQyxJQUFJLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBRUssSUFBQSxjQUE4RCxFQUE3RCxvQkFBTyxFQUFFLG9CQUFPLEVBQUUsa0RBQXNCLEVBQUUsa0JBQW1CO1FBRXBFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUM5QjtRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUM5QjtRQUVELElBQUksc0JBQXNCLElBQUksTUFBTSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDOzs7OztJQUVNLGlEQUFVOzs7O0lBQWpCLFVBQWtCLEtBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjs7WUFFRyxZQUFZLEdBQXVCLElBQUk7UUFDckMsSUFBQSxjQUFzRSxFQUFyRSwwQkFBVSxFQUFFLDRCQUFXLEVBQUUsb0RBQXVCLEVBQUUsa0JBQW1CO1FBRTVFLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3JDO1NBQ0Y7YUFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFOztZQUV2QyxJQUFBLHFCQUFpQyxFQUFoQyxjQUFJLEVBQUUsa0JBQTBCO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2hEOztnQkFFSyxTQUFTLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7WUFFcEYsWUFBWSxHQUFHLEVBQUMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQzs7Z0JBQ3JILEtBQUssR0FBWSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzNILElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO2dCQUVuSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7aUJBQzVHO2FBQ0Y7U0FDRjthQUNJLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFOztZQUVyQyxJQUFBLG9CQUE4RCxFQUE3RCx3QkFBUyxFQUFFLDRCQUFXLEVBQUUsb0JBQU8sRUFBRSx3QkFBNEI7WUFDbEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDMUIsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEQ7O2dCQUVLLFNBQVMsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLHVCQUF1QjtnQkFDakgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7WUFDL0QsWUFBWSxHQUFHLEVBQUMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQztZQUNwSCxJQUFBLDhFQUF3RixFQUF2RixnQkFBSyxFQUFFLFlBQWdGOztnQkFDeEYsS0FBSyxHQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7WUFDM0csSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQzs7b0JBRXZDLFNBQVMsR0FBaUIsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUM7Z0JBQ2hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO2dCQUV4SCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7aUJBQzVHO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7O0lBRU0sdURBQWdCOzs7O0lBQXZCLFVBQXdCLEVBQU87UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7Ozs7SUFFTSx3REFBaUI7Ozs7SUFBeEIsVUFBeUIsRUFBTztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7OztJQUVNLHVEQUFnQjs7OztJQUF2QixVQUF3QixVQUFtQjtRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFekUsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDOzs7OztJQUVNLCtDQUFROzs7O0lBQWYsVUFBZ0IsQ0FBa0I7O1lBQzFCLEtBQUssR0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBRXpDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7O1lBRUcsWUFBWSxHQUF1QixJQUFJO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN4QixZQUFZLEdBQUcsRUFBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBQyxDQUFDOztnQkFDcEgsSUFBSSxHQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztZQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFFLElBQUksRUFBQyxDQUFDO2FBQ2xDO1NBQ0Y7YUFDSTtZQUNILFlBQVksR0FBRyxFQUFDLHFCQUFxQixFQ