UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

480 lines (479 loc) 34.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; var SliderHandle = /** @class */ (function () { function SliderHandle(_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 = 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 = 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 = 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(SliderHandle.prototype, "min", { set: /** * @param {?} value * @return {?} */ function (value) { this._min = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "max", { set: /** * @param {?} value * @return {?} */ function (value) { this._max = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "minBound", { set: /** * @param {?} value * @return {?} */ function (value) { this._minBound = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "maxBound", { set: /** * @param {?} value * @return {?} */ function (value) { this._maxBound = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "step", { set: /** * @param {?} value * @return {?} */ function (value) { this._step = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.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(SliderHandle.prototype, "disabled", { set: /** * @param {?} value * @return {?} */ function (value) { this._disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "sliderLength", { set: /** * @param {?} value * @return {?} */ function (value) { this._sliderLength = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "sliderStart", { set: /** * @param {?} value * @return {?} */ function (value) { this._sliderStart = value; }, enumerable: true, configurable: true }); Object.defineProperty(SliderHandle.prototype, "handleStyle", { get: /** * @return {?} */ function () { return this._handleStyle; }, set: /** * @param {?} value * @return {?} */ function (value) { this._handleStyle = value; }, enumerable: true, configurable: true }); /* 手势操作 */ /** * @param {?} event * @return {?} */ SliderHandle.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 {?} */ SliderHandle.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 {?} */ SliderHandle.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 {?} */ SliderHandle.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 {?} */ SliderHandle.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 {?} */ SliderHandle.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(function (point) { return Math.abs(val - point); }); return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))]; }; /** * @param {?} step * @return {?} */ SliderHandle.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 {?} */ SliderHandle.prototype.calcOffset = /** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var ratio = (value - this._min) / (this._max - this._min); return ratio * 100; }; /** * @param {?} e * @return {?} */ SliderHandle.prototype.pauseEvent = /** * @param {?} e * @return {?} */ function (e) { e.stopPropagation(); e.preventDefault(); }; /** * @param {?} event * @return {?} */ SliderHandle.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 {?} */ SliderHandle.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 {?} */ SliderHandle.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; this.onAfterChange.emit(this._value); }; /** * @return {?} */ SliderHandle.prototype.ngOnDestroy = /** * @return {?} */ function () { document.removeEventListener('mousemove', this.mouseMove, false); document.removeEventListener('mouseup', this.mouseUp, false); }; SliderHandle.decorators = [ { type: Component, args: [{ selector: 'SliderHandle, nzm-slider-handle', template: "<div role=\"slider\"\n class=\"am-slider-handle\"\n [ngStyle]=\"handleStyle\"\n [style.left.%]=\"left\">\n</div>", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ SliderHandle.ctorParameters = function () { return [ { type: ElementRef }, { type: DomSanitizer } ]; }; SliderHandle.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 SliderHandle; }()); export { SliderHandle }; if (false) { /** @type {?} */ SliderHandle.prototype.left; /** @type {?} */ SliderHandle.prototype._min; /** @type {?} */ SliderHandle.prototype._max; /** @type {?} */ SliderHandle.prototype._step; /** @type {?} */ SliderHandle.prototype._value; /** @type {?} */ SliderHandle.prototype._disabled; /** @type {?} */ SliderHandle.prototype._marks; /** @type {?} */ SliderHandle.prototype._handleStyle; /** @type {?} */ SliderHandle.prototype._sliderLength; /** @type {?} */ SliderHandle.prototype._sliderStart; /** @type {?} */ SliderHandle.prototype._minBound; /** @type {?} */ SliderHandle.prototype._maxBound; /** @type {?} */ SliderHandle.prototype._startX; /** @type {?} */ SliderHandle.prototype._isDraging; /** @type {?} */ SliderHandle.prototype._handleStatus; /** @type {?} */ SliderHandle.prototype._handleOffsetX; /** @type {?} */ SliderHandle.prototype._oldValue; /** @type {?} */ SliderHandle.prototype.onChange; /** @type {?} */ SliderHandle.prototype.onAfterChange; /** @type {?} */ SliderHandle.prototype.mouseDown; /** @type {?} */ SliderHandle.prototype.mouseMove; /** @type {?} */ SliderHandle.prototype.mouseUp; /** @type {?} */ SliderHandle.prototype._elf; /** @type {?} */ SliderHandle.prototype._sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRVosaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7SUFtSHZELHNCQUFvQixJQUFnQixFQUFVLFVBQXdCO1FBQXRFLGlCQUEwRTtRQUF0RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBYzt5QkFyR3pDLEtBQUs7c0JBQ1QsRUFBRTswQkFPRyxLQUFLO3dCQW9EeEIsSUFBSSxZQUFZLEVBQU87NkJBRWxCLElBQUksWUFBWSxFQUFPO3lCQXlDM0IsVUFBQSxLQUFLO1lBQ2YsSUFBSSxDQUFDLEtBQUksQ0FBQyxTQUFTLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEQsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUM3QixLQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztnQkFDN0IsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsS0FBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFD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QyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3RDOzs7O0lBRUQsa0NBQVc7OztJQUFYO1FBQ0UsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztLQUM5RDs7Z0JBM09GLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsaUNBQWlDO29CQUMzQyx3SUFBNkM7b0JBQzdDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzs7OztnQkFkQyxVQUFVO2dCQVFILFlBQVk7OztzQkEyQmxCLEtBQUs7c0JBSUwsS0FBSzsyQkFJTCxLQUFLOzJCQUlMLEtBQUs7dUJBSUwsS0FBSzt3QkFJTCxLQUFLOzJCQU9MLEtBQUs7K0JBSUwsS0FBSzs4QkFJTCxLQUFLOzhCQUlMLEtBQUs7MkJBT0wsTUFBTTtnQ0FFTixNQUFNOzJCQUlOLFlBQVksU0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7MEJBVXJDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7eUJBYXBDLFlBQVksU0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3VCQWpIdEM7O1NBa0JhLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2xpZGVySGFuZGxlLCBuem0tc2xpZGVyLWhhbmRsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGlkZXItaGFuZGxlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJIYW5kbGUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGxlZnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWFya3M6IG9iamVjdCA9IHt9O1xuICBwcml2YXRlIF9oYW5kbGVTdHlsZTogb2JqZWN0O1xuICBwcml2YXRlIF9zbGlkZXJMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfc2xpZGVyU3RhcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWluQm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbWF4Qm91bmQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfc3RhcnRYOiBudW1iZXI7XG4gIHByaXZhdGUgX2lzRHJhZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9oYW5kbGVTdGF0dXM6IHN0cmluZztcbiAgcHJpdmF0ZSBfaGFuZGxlT2Zmc2V0WDogbnVtYmVyO1xuICBwcml2YXRlIF9vbGRWYWx1ZTogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtaW5Cb3VuZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluQm91bmQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4Qm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heEJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHN0ZXAodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3N0ZXAgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzbGlkZXJMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlckxlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzbGlkZXJTdGFydCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2xpZGVyU3RhcnQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaGFuZGxlU3R5bGUoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3R5bGU7XG4gIH1cbiAgc2V0IGhhbmRsZVN0eWxlKHZhbHVlOiBvYmplY3QpIHtcbiAgICB0aGlzLl9oYW5kbGVTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25BZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qIOaJi+WKv+aTjeS9nCAqL1xuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3N0YXJ0WCA9IGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnc3RhcnQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICBwYW5tb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9vbGRWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICBwYW5lbmQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5faXNEcmFnaW5nKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnZW5kJztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxuXG4gIG1vdXNlRG93biA9IGV2ZW50ID0+IHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuaXNNb3VzZVRhcmdldChldmVudCkpIHtcbiAgICAgIHRoaXMuX3N0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnc3RhcnQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwLCBmYWxzZSk7XG4gICAgICB0aGlzLnBhdXNlRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICBtb3VzZU1vdmUgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VFdmVudChldmVudCk7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX29sZFZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBtb3VzZVVwID0gZXZlbnQgPT4ge1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5faXNEcmFnaW5nKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTdGF0dXMgPSAnZW5kJztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgY2FsY1ZhbHVlQnlQb3MocG9zKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gcG9zIC0gdGhpcy5fc2xpZGVyU3RhcnQ7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5jYWxjVmFsdWUob2Zmc2V0KTtcbiAgICBpZiAodmFsdWUgPD0gdGhpcy5fbWluQm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWluQm91bmQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+PSB0aGlzLl9tYXhCb3VuZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9tYXhCb3VuZDtcbiAgICB9XG4gICAgY29uc3QgY2xvc2VzdFBvaW50ID0gdGhpcy5nZXRDbG9zZXN0UG9pbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl9zdGVwID09PSBudWxsID8gY2xvc2VzdFBvaW50IDogcGFyc2VGbG9hdChjbG9zZXN0UG9pbnQudG9GaXhlZCh0aGlzLmdldFByZWNpc2lvbih0aGlzLl9zdGVwKSkpO1xuICB9XG5cbiAgY2FsY1ZhbHVlKG9mZnNldCkge1xuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5hYnMoTWF0aC5tYXgob2Zmc2V0LCAwKSAvIHRoaXMuX3NsaWRlckxlbmd0aCk7XG4gICAgY29uc3QgdmFsdWUgPSByYXRpbyAqICh0aGlzLl9tYXggLSB0aGlzLl9taW4pICsgdGhpcy5fbWluO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGdldENsb3Nlc3RQb2ludCh2YWwpIHtcbiAgICBjb25zdCBwb2ludHMgPSBPYmplY3Qua2V5cyh0aGlzLl9tYXJrcykubWFwKHBhcnNlRmxvYXQpO1xuICAgIGlmICh0aGlzLl9zdGVwICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBjbG9zZXN0U3RlcCA9IE1hdGgucm91bmQoKHZhbCAtIHRoaXMuX21pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXAgKyB0aGlzLl9taW47XG4gICAgICBwb2ludHMucHVzaChjbG9zZXN0U3RlcCk7XG4gICAgfVxuICAgIGNvbnN0IGRpZmZzID0gcG9pbnRzLm1hcChmdW5jdGlvbihwb2ludCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbCAtIHBvaW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcG9pbnRzW2RpZmZzLmluZGV4T2YoTWF0aC5taW4uYXBwbHkoTWF0aCwgdGhpcy50b0NvbnN1bWFibGVBcnJheShkaWZmcykpKV07XG4gIH1cblxuICBnZXRQcmVjaXNpb24oc3RlcCkge1xuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSBzdGVwLnRvU3RyaW5nKCk7XG4gICAgbGV0IHByZWNpc2lvbiA9IDA7XG4gICAgaWYgKHN0ZXBTdHJpbmcuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgIHByZWNpc2lvbiA9IHN0ZXBTdHJpbmcubGVuZ3RoIC0gc3RlcFN0cmluZy5pbmRleE9mKCcuJykgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gcHJlY2lzaW9uO1xuICB9XG5cbiAgY2FsY09mZnNldCh2YWx1ZSkge1xuICAgIGNvbnN0IHJhdGlvID0gKHZhbHVlIC0gdGhpcy5fbWluKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgIHJldHVybiByYXRpbyAqIDEwMDtcbiAgfVxuXG4gIHBhdXNlRXZlbnQoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgaXNNb3VzZVRhcmdldChldmVudCkge1xuICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2U7XG4gICAgd2hpbGUgKHRhcmdldCAhPT0gbnVsbCAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Rm91bmQ7XG4gIH1cblxuICB0b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBjb25zdCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjI7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZURvd24sIGZhbHNlKTtcbiAgICB0aGlzLl9oYW5kbGVPZmZzZXRYID0gdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueDtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuX21pbkJvdW5kID0gdGhpcy5fbWluQm91bmQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX21pbiA6IHRoaXMuX21pbkJvdW5kO1xuICAgIHRoaXMuX21heEJvdW5kID0gdGhpcy5fbWF4Qm91bmQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX21heCA6IHRoaXMuX21heEJvdW5kO1xuICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICB9XG59XG4iXX0=