ngx-pluto
Version:
292 lines • 20.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter } from "@angular/core";
import * as moment_ from 'moment';
/** @type {?} */
const moment = moment_;
import { ComponentPortal } from "@angular/cdk/portal";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { NpInput } from "../../input";
import { NpDatePickerService } from "../date-picker.service";
import { NpDatePickerPopup } from "../components/date-picker-popup";
/**
* Year picker组件
*/
export class NpYearPicker {
/**
* @param {?} datePickerService
*/
constructor(datePickerService) {
this.datePickerService = datePickerService;
/**
* Placeholder
*/
this.placeholder = '';
/**
* 已选时间
*/
this.date = null;
/**
* 时间展示格式
*/
this.format = 'YYYY';
this.onYearChanged = new EventEmitter();
this.onYearClicked = new EventEmitter();
this.isHover = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* @return {?}
*/
ngOnInit() {
this.overlayRef = this.datePickerService.getOverlayRef(this.yearPickerInput.npInput);
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
}
/**
* @return {?}
*/
onToggleDatePickerPopup() {
if (this.isDisabled) {
return;
}
if (this.overlayRef.hasAttached()) {
this.closePopup();
return;
}
this.datePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDatePickerPopup));
this.datePickerPopupRef.instance.date = moment(this.date);
this.datePickerPopupRef.instance.datePickerType = 'year-picker';
this.datePickerPopupRef.instance.isShowYearsPanel = true;
this.subscribeNotifyEvents();
this.overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
() => {
this.closePopup();
}));
}
/**
* @param {?} data
* @return {?}
*/
onBlur(data) {
if (this.datePickerService.isValid(data.value)) {
this.date = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.date = moment().clone();
}
this.syncValue();
this.emitChange(this.date);
this.onYearChanged.emit(this.date);
}
/**
* @return {?}
*/
onClear() {
if (this.isDisabled) {
return;
}
this.date = null;
this.syncValue();
this.emitChange(this.date);
this.onYearChanged.emit(this.date);
}
/**
* @return {?}
*/
onMouseenter() {
this.isHover = true;
}
/**
* @return {?}
*/
onMouseleave() {
this.isHover = false;
}
//#region Private methods
/**
* 每次this.date改变时,这个方法都必须要调用
* @private
* @return {?}
*/
syncValue() {
if (this.date && this.datePickerService.isValid(this.date)) {
this.value = moment(this.date, this.format).format(this.format);
}
else {
this.value = '';
}
}
/**
* @private
* @return {?}
*/
closePopup() {
if (this.overlayRef.hasAttached) {
this.overlayRef.detach();
}
}
/**
* @private
* @return {?}
*/
subscribeNotifyEvents() {
this.datePickerPopupRef.instance.onYearClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.emitDataAndClosePopup(res.date);
}));
}
/**
* @private
* @param {?} date
* @return {?}
*/
emitDataAndClosePopup(date) {
this.date = date;
this.syncValue();
this.emitChange(this.date);
this.onYearChanged.emit(this.date);
this.yearPickerInput.focus();
this.closePopup();
}
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
this.date = obj;
this.syncValue();
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.emitChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
}
NpYearPicker.decorators = [
{ type: Component, args: [{
selector: `np-year-picker`,
template: "<div class=\"np-year-picker-wrapper flex-wrap col-flex\" (mouseenter)=\"onMouseenter()\" (mouseleave)=\"onMouseleave()\">\r\n <i *ngIf=\"!isHover\" class=\"far fa-calendar\"></i>\r\n <i *ngIf=\"isHover\" class=\"fas fa-times-circle\" (click)=\"onClear()\"></i>\r\n <np-input #yearPickerInput [label]=\"label\" [isRequired]=\"isRequired\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\" [errorMessage]=\"errorMessage\" [(ngModel)]=\"value\" (click)=\"onToggleDatePickerPopup()\"\r\n (onBlur)=\"onBlur($event)\">\r\n </np-input>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NpYearPicker)),
multi: true,
}
],
styles: [".np-year-picker-wrapper{position:relative}.np-year-picker-wrapper>.far.fa-calendar,.np-year-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-year-picker-wrapper .np-input-wrapper .np-input{width:220px}"]
}] }
];
/** @nocollapse */
NpYearPicker.ctorParameters = () => [
{ type: NpDatePickerService }
];
NpYearPicker.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
placeholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
date: [{ type: Input }],
format: [{ type: Input }],
onYearChanged: [{ type: Output }],
onYearClicked: [{ type: Output }],
yearPickerInput: [{ type: ViewChild, args: ['yearPickerInput',] }]
};
if (false) {
/**
* 标签
* @type {?}
*/
NpYearPicker.prototype.label;
/**
* 是否必填,true仅在标签前面添加红色*号, false不加
* @type {?}
*/
NpYearPicker.prototype.isRequired;
/**
* Placeholder
* @type {?}
*/
NpYearPicker.prototype.placeholder;
/**
* 校验错误时显示错误信息
* @type {?}
*/
NpYearPicker.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpYearPicker.prototype.isDisabled;
/**
* 已选时间
* @type {?}
*/
NpYearPicker.prototype.date;
/**
* 时间展示格式
* @type {?}
*/
NpYearPicker.prototype.format;
/** @type {?} */
NpYearPicker.prototype.onYearChanged;
/** @type {?} */
NpYearPicker.prototype.onYearClicked;
/** @type {?} */
NpYearPicker.prototype.yearPickerInput;
/** @type {?} */
NpYearPicker.prototype.datePickerPopupRef;
/**
* @type {?}
* @private
*/
NpYearPicker.prototype.overlayRef;
/** @type {?} */
NpYearPicker.prototype.isHover;
/**
* @type {?}
* @private
*/
NpYearPicker.prototype.emitChange;
/**
* 日期输入框文本值,每当this.date改变时此值会同步改变
* @type {?}
*/
NpYearPicker.prototype.value;
/**
* @type {?}
* @private
*/
NpYearPicker.prototype.datePickerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIveWVhci1waWNrZXIveWVhci1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDOztNQUFPLE1BQU0sR0FBRyxPQUFPO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7OztBQW1CcEUsTUFBTSxPQUFPLFlBQVk7Ozs7SUFnQ3ZCLFlBQW9CLGlCQUFzQztRQUF0QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXFCOzs7O1FBekJqRCxnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7OztRQU96QixTQUFJLEdBQTRCLElBQUksQ0FBQzs7OztRQUVyQyxXQUFNLEdBQVcsTUFBTSxDQUFDO1FBRXZCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN4QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFNdkQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVqQixlQUFVOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQztJQUt5QixDQUFDOzs7O0lBRS9ELFFBQVE7UUFDTixJQUFJLENBQUMsVUFB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LEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozt3QkFBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUM7d0JBQzNDLEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGOzthQUNGOzs7O1lBbEJRLG1CQUFtQjs7O29CQXVCekIsS0FBSzt5QkFFTCxLQUFLOzBCQUVMLEtBQUs7MkJBRUwsS0FBSzt5QkFFTCxLQUFLO21CQUdMLEtBQUs7cUJBRUwsS0FBSzs0QkFFTCxNQUFNOzRCQUNOLE1BQU07OEJBRU4sU0FBUyxTQUFDLGlCQUFpQjs7Ozs7OztJQWxCNUIsNkJBQXVCOzs7OztJQUV2QixrQ0FBNkI7Ozs7O0lBRTdCLG1DQUFrQzs7Ozs7SUFFbEMsb0NBQThCOzs7OztJQUU5QixrQ0FBNkI7Ozs7O0lBRzdCLDRCQUE4Qzs7Ozs7SUFFOUMsOEJBQWlDOztJQUVqQyxxQ0FBa0Q7O0lBQ2xELHFDQUF1RDs7SUFFdkQsdUNBQXVEOztJQUV2RCwwQ0FBbUQ7Ozs7O0lBQ25ELGtDQUErQjs7SUFDL0IsK0JBQXlCOzs7OztJQUV6QixrQ0FBcUM7Ozs7O0lBR3JDLDZCQUFjOzs7OztJQUVGLHlDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5wSW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXRcIjtcclxuaW1wb3J0IHsgTnBEYXRlUGlja2VyU2VydmljZSwgWWVhckRhdGEgfSBmcm9tIFwiLi4vZGF0ZS1waWNrZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBOcERhdGVQaWNrZXJQb3B1cCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLXBvcHVwXCI7XHJcblxyXG4vKipcclxuICogWWVhciBwaWNrZXLnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAteWVhci1waWNrZXJgLFxyXG4gIHRlbXBsYXRlVXJsOiAneWVhci1waWNrZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ3llYXItcGlja2VyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBZZWFyUGlja2VyKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE5wWWVhclBpY2tlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gIC8qKuagh+etviAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm5b+F5aGr77yMdHJ1ZeS7heWcqOagh+etvuWJjemdoua3u+WKoOe6ouiJsirlj7fvvIwgZmFsc2XkuI3liqAqL1xyXG4gIEBJbnB1dCgpIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgLyoqUGxhY2Vob2xkZXIgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcbiAgLyoq5qCh6aqM6ZSZ6K+v5pe25pi+56S66ZSZ6K+v5L+h5oGvICovXHJcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm56aB55SoICovXHJcbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgLyoq5bey6YCJ5pe26Ze0ICovXHJcbiAgQElucHV0KCkgZGF0ZTogbW9tZW50Xy5Nb21lbnQgfCBzdHJpbmcgPSBudWxsO1xyXG4gIC8qKuaXtumXtOWxleekuuagvOW8jyAqL1xyXG4gIEBJbnB1dCgpIGZvcm1hdDogc3RyaW5nID0gJ1lZWVknO1xyXG5cclxuICBAT3V0cHV0KCkgb25ZZWFyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblllYXJDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxZZWFyRGF0YT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgneWVhclBpY2tlcklucHV0JykgeWVhclBpY2tlcklucHV0OiBOcElucHV0O1xyXG5cclxuICBkYXRlUGlja2VyUG9wdXBSZWY6IENvbXBvbmVudFJlZjxOcERhdGVQaWNrZXJQb3B1cD5cclxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XHJcbiAgaXNIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIC8qKuaXpeacn+i+k+WFpeahhuaWh+acrOWAvO+8jOavj+W9k3RoaXMuZGF0ZeaUueWPmOaXtuatpOWAvOS8muWQjOatpeaUueWPmCovXHJcbiAgdmFsdWU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogTnBEYXRlUGlja2VyU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRPdmVybGF5UmVmKHRoaXMueWVhclBpY2tlcklucHV0Lm5wSW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVEYXRlUGlja2VyUG9wdXAoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IENvbXBvbmVudFBvcnRhbChOcERhdGVQaWNrZXJQb3B1cCkpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZGF0ZSA9IG1vbWVudCh0aGlzLmRhdGUpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZGF0ZVBpY2tlclR5cGUgPSAneWVhci1waWNrZXInO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuaXNTaG93WWVhcnNQYW5lbCA9IHRydWU7XHJcbiAgICB0aGlzLnN1YnNjcmliZU5vdGlmeUV2ZW50cygpO1xyXG5cclxuICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQmx1cihkYXRhOiB7IHZhbHVlOiBhbnksIGV2ZW50OiBhbnkgfSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZChkYXRhLnZhbHVlKSkge1xyXG4gICAgICB0aGlzLmRhdGUgPSBtb21lbnQoZGF0YS52YWx1ZSwgdGhpcy5mb3JtYXQpLmNsb25lKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzovpPlhaXml6XmnJ/kuI3lkIjms5XvvIzpu5jorqTlvZPliY3ml7bpl7RcclxuICAgICAgdGhpcy5kYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuZGF0ZSk7XHJcbiAgICB0aGlzLm9uWWVhckNoYW5nZWQuZW1pdCh0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuZGF0ZSk7XHJcbiAgICB0aGlzLm9uWWVhckNoYW5nZWQuZW1pdCh0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZWVudGVyKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VsZWF2ZSgpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIFByaXZhdGUgbWV0aG9kc1xyXG5cclxuICAvKirmr4/mrKF0aGlzLmRhdGXmlLnlj5jml7bvvIzov5nkuKrmlrnms5Xpg73lv4XpobvopoHosIPnlKggKi9cclxuICBwcml2YXRlIHN5bmNWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGUgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuZGF0ZSkpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IG1vbWVudCh0aGlzLmRhdGUsIHRoaXMuZm9ybWF0KS5mb3JtYXQodGhpcy5mb3JtYXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVBvcHVwKCkge1xyXG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZi5oYXNBdHRhY2hlZCkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU5vdGlmeUV2ZW50cygpIHtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uWWVhckNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IFllYXJEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKHJlcy5kYXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0RGF0YUFuZENsb3NlUG9wdXAoZGF0ZTogbW9tZW50Xy5Nb21lbnQpIHtcclxuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuZGF0ZSk7XHJcbiAgICB0aGlzLm9uWWVhckNoYW5nZWQuZW1pdCh0aGlzLmRhdGUpO1xyXG4gICAgdGhpcy55ZWFyUGlja2VySW5wdXQuZm9jdXMoKTtcclxuICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGUgPSBvYmo7XHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59Il19