ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
550 lines • 36.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
var SliderHandleComponent = /** @class */ (function () {
function SliderHandleComponent(_elf, _sanitizer) {
var _this = this;
this._elf = _elf;
this._sanitizer = _sanitizer;
this._disabled = false;
this._marks = {};
this._isDraging = false;
this.onChange = new EventEmitter();
this.onAfterChange = new EventEmitter();
this.mouseDown = (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (!_this._disabled && _this.isMouseTarget(event)) {
_this._startX = event.clientX;
_this._handleStatus = 'start';
_this._isDraging = true;
document.addEventListener('mousemove', _this.mouseMove, false);
document.addEventListener('mouseup', _this.mouseUp, false);
_this.pauseEvent(event);
}
});
this.mouseMove = (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (!_this._disabled && _this._isDraging) {
_this.pauseEvent(event);
/** @type {?} */
var pos = event.clientX;
_this._value = Math.round(_this.calcValueByPos(pos));
_this.left = _this.calcOffset(_this._value);
if (_this._oldValue !== _this._value) {
_this._oldValue = _this._value;
_this.onChange.emit(_this._value);
}
}
});
this.mouseUp = (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (!_this._disabled && _this._isDraging) {
_this._handleStatus = 'end';
_this._isDraging = false;
/** @type {?} */
var pos = event.clientX;
_this._value = Math.round(_this.calcValueByPos(pos));
_this.left = _this.calcOffset(_this._value);
_this.onAfterChange.emit(_this._value);
}
});
}
Object.defineProperty(SliderHandleComponent.prototype, "min", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._min = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "max", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._max = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "minBound", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._minBound = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "maxBound", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._maxBound = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "step", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._step = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "value", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value;
if (this._value) {
this.left = this.calcOffset(this._value);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "disabled", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "sliderLength", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._sliderLength = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "sliderStart", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._sliderStart = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SliderHandleComponent.prototype, "handleStyle", {
get: /**
* @return {?}
*/
function () {
return this._handleStyle;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._handleStyle = value;
},
enumerable: true,
configurable: true
});
/* 手势操作 */
/* 手势操作 */
/**
* @param {?} event
* @return {?}
*/
SliderHandleComponent.prototype.panstart = /* 手势操作 */
/**
* @param {?} event
* @return {?}
*/
function (event) {
// event.preventDefault();
if (!this._disabled) {
this._startX = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
this._handleStatus = 'start';
this._isDraging = true;
}
};
/**
* @param {?} event
* @return {?}
*/
SliderHandleComponent.prototype.panmove = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
/** @type {?} */
var pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
if (this._oldValue !== this._value) {
this._oldValue = this._value;
this.onChange.emit(this._value);
}
}
};
/**
* @param {?} event
* @return {?}
*/
SliderHandleComponent.prototype.panend = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
this._handleStatus = 'end';
this._isDraging = false;
/** @type {?} */
var pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
this.onAfterChange.emit(this._value);
}
};
/**
* @param {?} pos
* @return {?}
*/
SliderHandleComponent.prototype.calcValueByPos = /**
* @param {?} pos
* @return {?}
*/
function (pos) {
/** @type {?} */
var offset = pos - this._sliderStart;
/** @type {?} */
var value = this.calcValue(offset);
if (value <= this._minBound) {
value = this._minBound;
}
if (value >= this._maxBound) {
value = this._maxBound;
}
/** @type {?} */
var closestPoint = this.getClosestPoint(value);
return this._step === null ? closestPoint : parseFloat(closestPoint.toFixed(this.getPrecision(this._step)));
};
/**
* @param {?} offset
* @return {?}
*/
SliderHandleComponent.prototype.calcValue = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
/** @type {?} */
var ratio = Math.abs(Math.max(offset, 0) / this._sliderLength);
/** @type {?} */
var value = ratio * (this._max - this._min) + this._min;
return value;
};
/**
* @param {?} val
* @return {?}
*/
SliderHandleComponent.prototype.getClosestPoint = /**
* @param {?} val
* @return {?}
*/
function (val) {
/** @type {?} */
var points = Object.keys(this._marks).map(parseFloat);
if (this._step !== null) {
/** @type {?} */
var closestStep = Math.round((val - this._min) / this._step) * this._step + this._min;
points.push(closestStep);
}
/** @type {?} */
var diffs = points.map((/**
* @param {?} point
* @return {?}
*/
function (point) {
return Math.abs(val - point);
}));
return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))];
};
/**
* @param {?} step
* @return {?}
*/
SliderHandleComponent.prototype.getPrecision = /**
* @param {?} step
* @return {?}
*/
function (step) {
/** @type {?} */
var stepString = step.toString();
/** @type {?} */
var precision = 0;
if (stepString.indexOf('.') >= 0) {
precision = stepString.length - stepString.indexOf('.') - 1;
}
return precision;
};
/**
* @param {?} value
* @return {?}
*/
SliderHandleComponent.prototype.calcOffset = /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var ratio = (value - this._min) / (this._max - this._min);
return ratio * 100;
};
/**
* @param {?} e
* @return {?}
*/
SliderHandleComponent.prototype.pauseEvent = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.stopPropagation();
e.preventDefault();
};
/**
* @param {?} event
* @return {?}
*/
SliderHandleComponent.prototype.isMouseTarget = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var target = event.target;
/** @type {?} */
var parentFound = false;
while (target !== null && !parentFound) {
if (target === this._elf.nativeElement) {
parentFound = true;
}
target = target.parentElement;
}
return parentFound;
};
/**
* @param {?} arr
* @return {?}
*/
SliderHandleComponent.prototype.toConsumableArray = /**
* @param {?} arr
* @return {?}
*/
function (arr) {
if (Array.isArray(arr)) {
/** @type {?} */
var arr2 = Array(arr.length);
for (var i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
};
/**
* @return {?}
*/
SliderHandleComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var self = this;
this._elf.nativeElement.addEventListener('mousedown', this.mouseDown, false);
this._handleOffsetX = this._elf.nativeElement.getBoundingClientRect().x;
this.left = this.calcOffset(this._value);
this._minBound = this._minBound === undefined ? this._min : this._minBound;
this._maxBound = this._maxBound === undefined ? this._max : this._maxBound;
};
/**
* @return {?}
*/
SliderHandleComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
document.removeEventListener('mousemove', this.mouseMove, false);
document.removeEventListener('mouseup', this.mouseUp, false);
};
SliderHandleComponent.decorators = [
{ type: Component, args: [{
selector: 'SliderHandle, nzm-slider-handle',
template: "<div role=\"slider\" class=\"am-slider-handle\" [ngStyle]=\"handleStyle\" [style.left.%]=\"left\"></div>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
SliderHandleComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: DomSanitizer }
]; };
SliderHandleComponent.propDecorators = {
min: [{ type: Input }],
max: [{ type: Input }],
minBound: [{ type: Input }],
maxBound: [{ type: Input }],
step: [{ type: Input }],
value: [{ type: Input }],
disabled: [{ type: Input }],
sliderLength: [{ type: Input }],
sliderStart: [{ type: Input }],
handleStyle: [{ type: Input }],
onChange: [{ type: Output }],
onAfterChange: [{ type: Output }],
panstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
panmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
panend: [{ type: HostListener, args: ['touchend', ['$event'],] }]
};
return SliderHandleComponent;
}());
export { SliderHandleComponent };
if (false) {
/** @type {?} */
SliderHandleComponent.prototype.left;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._min;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._max;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._step;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._value;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._marks;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleStyle;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sliderLength;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sliderStart;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._minBound;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._maxBound;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._startX;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._isDraging;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleStatus;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleOffsetX;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._oldValue;
/** @type {?} */
SliderHandleComponent.prototype.onChange;
/** @type {?} */
SliderHandleComponent.prototype.onAfterChange;
/** @type {?} */
SliderHandleComponent.prototype.mouseDown;
/** @type {?} */
SliderHandleComponent.prototype.mouseMove;
/** @type {?} */
SliderHandleComponent.prototype.mouseUp;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._elf;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRVosaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RDtJQWlIRSwrQkFBb0IsSUFBZ0IsRUFBVSxVQUF3QjtRQUF0RSxpQkFBMEU7UUFBdEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQWM7UUFyRzlELGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQU9wQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBb0RwQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUF5Q3hDLGNBQVM7Ozs7UUFBRyxVQUFBLEtBQUs7WUFDZixJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsSUFBSSxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoRCxLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLEtBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUM3QixLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxLQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENB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Qiw2Q0FBNkI7Ozs7O0lBQzdCLDhDQUE4Qjs7Ozs7SUFDOUIsNkNBQTZCOzs7OztJQUM3QiwwQ0FBMEI7Ozs7O0lBQzFCLDBDQUEwQjs7Ozs7SUFDMUIsd0NBQXdCOzs7OztJQUN4QiwyQ0FBb0M7Ozs7O0lBQ3BDLDhDQUE4Qjs7Ozs7SUFDOUIsK0NBQStCOzs7OztJQUMvQiwwQ0FBMEI7O0lBZ0QxQix5Q0FDbUM7O0lBQ25DLDhDQUN3Qzs7SUF5Q3hDLDBDQVNDOztJQUVELDBDQVdDOztJQUVELHdDQVNDOzs7OztJQW5DVyxxQ0FBd0I7Ozs7O0lBQUUsMkNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1NsaWRlckhhbmRsZSwgbnptLXNsaWRlci1oYW5kbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWhhbmRsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVySGFuZGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBsZWZ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX21hcmtzOiBvYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3R5bGU6IG9iamVjdDtcbiAgcHJpdmF0ZSBfc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3NsaWRlclN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgX21pbkJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX21heEJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIF9pc0RyYWdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3RhdHVzOiBzdHJpbmc7XG4gIHByaXZhdGUgX2hhbmRsZU9mZnNldFg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2xkVmFsdWU6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluQm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbkJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heEJvdW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZXJMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyU3RhcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlclN0YXJ0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5faGFuZGxlU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiDmiYvlir/mk43kvZwgKi9cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgLy8gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fb2xkVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX29sZFZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ2VuZCc7XG4gICAgICB0aGlzLl9pc0RyYWdpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBtb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLmlzTW91c2VUYXJnZXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICAgICAgdGhpcy5wYXVzZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBtb3VzZU1vdmUgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VFdmVudChldmVudCk7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX29sZFZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVN0YXR1cyA9ICdlbmQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gZmFsc2U7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGNWYWx1ZUJ5UG9zKHBvcykge1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcyAtIHRoaXMuX3NsaWRlclN0YXJ0O1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FsY1ZhbHVlKG9mZnNldCk7XG4gICAgaWYgKHZhbHVlIDw9IHRoaXMuX21pbkJvdW5kKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX21pbkJvdW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPj0gdGhpcy5fbWF4Qm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWF4Qm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RQb2ludCA9IHRoaXMuZ2V0Q2xvc2VzdFBvaW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fc3RlcCA9PT0gbnVsbCA/IGNsb3Nlc3RQb2ludCA6IHBhcnNlRmxvYXQoY2xvc2VzdFBvaW50LnRvRml4ZWQodGhpcy5nZXRQcmVjaXNpb24odGhpcy5fc3RlcCkpKTtcbiAgfVxuXG4gIGNhbGNWYWx1ZShvZmZzZXQpIHtcbiAgICBjb25zdCByYXRpbyA9IE1hdGguYWJzKE1hdGgubWF4KG9mZnNldCwgMCkgLyB0aGlzLl9zbGlkZXJMZW5ndGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcmF0aW8gKiAodGhpcy5fbWF4IC0gdGhpcy5fbWluKSArIHRoaXMuX21pbjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRDbG9zZXN0UG9pbnQodmFsKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWFya3MpLm1hcChwYXJzZUZsb2F0KTtcbiAgICBpZiAodGhpcy5fc3RlcCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xvc2VzdFN0ZXAgPSBNYXRoLnJvdW5kKCh2YWwgLSB0aGlzLl9taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwICsgdGhpcy5fbWluO1xuICAgICAgcG9pbnRzLnB1c2goY2xvc2VzdFN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBkaWZmcyA9IHBvaW50cy5tYXAoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh2YWwgLSBwb2ludCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBvaW50c1tkaWZmcy5pbmRleE9mKE1hdGgubWluLmFwcGx5KE1hdGgsIHRoaXMudG9Db25zdW1hYmxlQXJyYXkoZGlmZnMpKSldO1xuICB9XG5cbiAgZ2V0UHJlY2lzaW9uKHN0ZXApIHtcbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC50b1N0cmluZygpO1xuICAgIGxldCBwcmVjaXNpb24gPSAwO1xuICAgIGlmIChzdGVwU3RyaW5nLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICBwcmVjaXNpb24gPSBzdGVwU3RyaW5nLmxlbmd0aCAtIHN0ZXBTdHJpbmcuaW5kZXhPZignLicpIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuXG4gIGNhbGNPZmZzZXQodmFsdWUpIHtcbiAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMuX21pbikgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICByZXR1cm4gcmF0aW8gKiAxMDA7XG4gIH1cblxuICBwYXVzZUV2ZW50KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGlzTW91c2VUYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlICh0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEZvdW5kO1xuICB9XG5cbiAgdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgY29uc3QgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyMltpXSA9IGFycltpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIyO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2VEb3duLCBmYWxzZSk7XG4gICAgdGhpcy5faGFuZGxlT2Zmc2V0WCA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl9taW5Cb3VuZCA9IHRoaXMuX21pbkJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9taW4gOiB0aGlzLl9taW5Cb3VuZDtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHRoaXMuX21heEJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9tYXggOiB0aGlzLl9tYXhCb3VuZDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICB9XG59XG4iXX0=