ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
429 lines (428 loc) • 30.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
/**
* @record
*/
export function ElementType() { }
/** @type {?} */
ElementType.prototype.type;
/** @type {?} */
ElementType.prototype.backgroundImage;
/** @type {?} */
ElementType.prototype.transform;
var ImagePicker = /** @class */ (function () {
function ImagePicker() {
this.prefixCls = 'am-image-picker';
this.flexEl = [];
this._accept = 'image/*';
this._count = 4;
this._selectable = true;
this._files = [];
this._multiple = false;
this.onFail = new EventEmitter();
this.onChange = new EventEmitter();
this.onImageClick = new EventEmitter();
this.onAddImageClick = new EventEmitter();
}
Object.defineProperty(ImagePicker.prototype, "files", {
get: /**
* @return {?}
*/
function () {
return this._files;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._files = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePicker.prototype, "accept", {
get: /**
* @return {?}
*/
function () {
return this._accept;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._accept = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePicker.prototype, "length", {
get: /**
* @return {?}
*/
function () {
return this._count;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value > 0) {
this._count = value;
}
else {
this._count = 4;
}
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePicker.prototype, "multiple", {
get: /**
* @return {?}
*/
function () {
return this._multiple;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._multiple = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePicker.prototype, "selectable", {
get: /**
* @return {?}
*/
function () {
return this._selectable;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._selectable = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ImagePicker.prototype.sortItem = /**
* @return {?}
*/
function () {
var _this = this;
if (!this._files) {
return;
}
/** @type {?} */
var count = parseInt('' + this._count, 10);
if (count <= 0) {
count = 4;
}
/** @type {?} */
var allEl = this._files.map(function (item) {
return {
type: 'img',
backgroundImage: 'url(' + item.url + ')',
transform: 'rotate(' + _this.getRotation(item.orientation) + ')deg'
};
});
if (this._selectable) {
allEl.push({
type: 'select',
backgroundImage: '',
transform: ''
});
}
/** @type {?} */
var length = allEl.length;
if (length !== 0 && length % count !== 0) {
/** @type {?} */
var blankCount = count - (length % count);
/** @type {?} */
var fillBlankEl = [];
for (var i = 0; i < blankCount; i++) {
fillBlankEl.push({
type: 'white',
backgroundImage: '',
transform: ''
});
}
allEl = allEl.concat(fillBlankEl);
}
this.flexEl = [];
for (var i = 0; i < allEl.length / count; i++) {
/** @type {?} */
var rowEl = allEl.slice(i * count, i * count + count);
this.flexEl.push(rowEl);
}
};
/**
* @param {?} imgItem
* @return {?}
*/
ImagePicker.prototype.addImage = /**
* @param {?} imgItem
* @return {?}
*/
function (imgItem) {
this._files.push({
type: 'img',
url: imgItem.url,
orientation: imgItem.orientation
});
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'add',
index: this._files.length - 1
});
};
/**
* @param {?} index
* @return {?}
*/
ImagePicker.prototype.removeImage = /**
* @param {?} index
* @return {?}
*/
function (index) {
this._files.splice(index, 1);
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'remove',
index: index
});
};
/**
* @param {?} index
* @return {?}
*/
ImagePicker.prototype.imageClick = /**
* @param {?} index
* @return {?}
*/
function (index) {
this.onImageClick.emit({
index: index,
files: this._files
});
};
/**
* @param {?} e
* @return {?}
*/
ImagePicker.prototype.addImageClick = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onAddImageClick.emit(e);
};
/**
* @param {?} file
* @param {?} index
* @return {?}
*/
ImagePicker.prototype.parseFile = /**
* @param {?} file
* @param {?} index
* @return {?}
*/
function (file, index) {
var _this = this;
/** @type {?} */
var reader = new FileReader();
reader.onload = function (e) {
/** @type {?} */
var dataURL = (/** @type {?} */ (e.target)).result;
if (!dataURL) {
_this.onFail.emit("Fail to get the " + index + " image");
return;
}
/** @type {?} */
var orientation = 1;
_this.getOrientation(file, function (res) {
// -2: not jpeg , -1: not defined
if (res > 0) {
orientation = res;
}
_this.addImage({
url: dataURL,
orientation: orientation,
file: file
});
});
};
reader.readAsDataURL(file);
};
/**
* @param {?} event
* @return {?}
*/
ImagePicker.prototype.fileChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var fileList = event.target.files;
if (fileList && fileList.length) {
for (var i = 0; i < fileList.length; i++) {
this.parseFile(fileList[i], i);
}
}
};
/**
* @param {?=} orientation
* @return {?}
*/
ImagePicker.prototype.getRotation = /**
* @param {?=} orientation
* @return {?}
*/
function (orientation) {
if (orientation === void 0) { orientation = 1; }
/** @type {?} */
var imgRotation = 0;
switch (orientation) {
case 3:
imgRotation = 180;
break;
case 6:
imgRotation = 90;
break;
case 8:
imgRotation = 270;
break;
default:
}
return imgRotation;
};
// http://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
/**
* @param {?} file
* @param {?} callback
* @return {?}
*/
ImagePicker.prototype.getOrientation = /**
* @param {?} file
* @param {?} callback
* @return {?}
*/
function (file, callback) {
/** @type {?} */
var reader = new FileReader();
reader.onload = function (e) {
/** @type {?} */
var view = new DataView((/** @type {?} */ (e.target)).result);
if (view.getUint16(0, false) !== 0xffd8) {
return callback(-2);
}
/** @type {?} */
var length = view.byteLength;
/** @type {?} */
var offset = 2;
while (offset < length) {
/** @type {?} */
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xffe1) {
/** @type {?} */
var tmp = view.getUint32((offset += 2), false);
if (tmp !== 0x45786966) {
return callback(-1);
}
/** @type {?} */
var little = view.getUint16((offset += 6), false) === 0x4949;
offset += view.getUint32(offset + 4, little);
/** @type {?} */
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++) {
if (view.getUint16(offset + i * 12, little) === 0x0112) {
return callback(view.getUint16(offset + i * 12 + 8, little));
}
}
}
else if ((marker & 0xff00) !== 0xff00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
};
reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
};
ImagePicker.decorators = [
{ type: Component, args: [{
selector: 'ImagePicker, nzm-image-picker',
template: "<div class=\"{{prefixCls}}-list\" role=\"group\">\n <Flex *ngFor=\"let rowItem of flexEl;let i = index;\">\n <FlexItem *ngFor=\"let item of rowItem;let j =index;\">\n <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{prefixCls}}-item\">\n <div role=\"button\"\n aria-label=\"Click and Remove this image\"\n class=\"{{prefixCls}}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div role=\"button\"\n aria-label=\"Image can be clicked\"\n class=\"{{prefixCls}}-item-content\"\n [ngStyle]=\"{'background-image': item.backgroundImage, 'transform': item.transform}\"\n (click)=\"imageClick(i * length + j)\"\n ></div>\n </div>\n <div role=\"button\"\n aria-label=\"Choose and add image\"\n *ngIf=\"item && 'select' === item.type\"\n class=\"{{prefixCls}}-item {{prefixCls}}-upload-btn\"\n (click)=\"addImageClick($event)\"\n >\n <input #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{prefixCls}}-item-white\">\n </div>\n </FlexItem>\n </Flex>\n</div>\n"
}] }
];
/** @nocollapse */
ImagePicker.ctorParameters = function () { return []; };
ImagePicker.propDecorators = {
_fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef },] }],
files: [{ type: Input }],
accept: [{ type: Input }],
length: [{ type: Input }],
multiple: [{ type: Input }],
selectable: [{ type: Input }],
onFail: [{ type: Output }],
onChange: [{ type: Output }],
onImageClick: [{ type: Output }],
onAddImageClick: [{ type: Output }]
};
return ImagePicker;
}());
export { ImagePicker };
if (false) {
/** @type {?} */
ImagePicker.prototype.prefixCls;
/** @type {?} */
ImagePicker.prototype.flexEl;
/** @type {?} */
ImagePicker.prototype._accept;
/** @type {?} */
ImagePicker.prototype._count;
/** @type {?} */
ImagePicker.prototype._selectable;
/** @type {?} */
ImagePicker.prototype._files;
/** @type {?} */
ImagePicker.prototype._multiple;
/** @type {?} */
ImagePicker.prototype._fileSelectorInput;
/** @type {?} */
ImagePicker.prototype.onFail;
/** @type {?} */
ImagePicker.prototype.onChange;
/** @type {?} */
ImagePicker.prototype.onImageClick;
/** @type {?} */
ImagePicker.prototype.onAddImageClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7SUE4RWxHO3lCQWpFb0IsaUJBQWlCO3NCQUNYLEVBQUU7dUJBRUYsU0FBUztzQkFDVixDQUFDOzJCQUNLLElBQUk7c0JBQ04sRUFBRTt5QkFDRixLQUFLO3NCQWtETixJQUFJLFlBQVksRUFBRTt3QkFFaEIsSUFBSSxZQUFZLEVBQUU7NEJBRWQsSUFBSSxZQUFZLEVBQUU7K0JBRWYsSUFBSSxZQUFZLEVBQUU7S0FFdkM7SUFyRGhCLHNCQUNJLDhCQUFLOzs7O1FBRFQ7WUFFRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDcEI7Ozs7O1FBQ0QsVUFBVSxLQUFpQjtZQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7OztPQUpBO0lBS0Qsc0JBQ0ksK0JBQU07Ozs7UUFEVjtZQUVFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyQjs7Ozs7UUFDRCxVQUFXLEtBQWE7WUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCOzs7T0FKQTtJQUtELHNCQUNJLCtCQUFNOzs7O1FBRFY7WUFFRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDcEI7Ozs7O1FBQ0QsVUFBVyxLQUFhO1lBQ3RCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDYixJQUFJLENB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U0FBQztvQkFDVCxRQUFRLEVBQUUsK0JBQStCO29CQUN6QyxvNENBQTRDO2lCQUM3Qzs7Ozs7cUNBV0UsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO3dCQUd6RCxLQUFLO3lCQVFMLEtBQUs7eUJBUUwsS0FBSzsyQkFZTCxLQUFLOzZCQVFMLEtBQUs7eUJBUUwsTUFBTTsyQkFFTixNQUFNOytCQUVOLE1BQU07a0NBRU4sTUFBTTs7c0JBM0VUOztTQVlhLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFR5cGUge1xuICB0eXBlOiBzdHJpbmc7IC8vICdpbWcnIHwgJ3NlbGVjdCcgfCAnd2hpdGUnXG4gIGJhY2tncm91bmRJbWFnZTogc3RyaW5nO1xuICB0cmFuc2Zvcm06IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnSW1hZ2VQaWNrZXIsIG56bS1pbWFnZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVBpY2tlciB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLWltYWdlLXBpY2tlcic7XG4gIGZsZXhFbDogRWxlbWVudFR5cGVbXVtdID0gW107XG5cbiAgcHJpdmF0ZSBfYWNjZXB0OiBzdHJpbmcgPSAnaW1hZ2UvKic7XG4gIHByaXZhdGUgX2NvdW50OiBudW1iZXIgPSA0O1xuICBwcml2YXRlIF9zZWxlY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZmlsZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmaWxlU2VsZWN0b3JJbnB1dCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBwcml2YXRlIF9maWxlU2VsZWN0b3JJbnB1dDogVmlld0NvbnRhaW5lclJlZjtcblxuICBASW5wdXQoKVxuICBnZXQgZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICB9XG4gIHNldCBmaWxlcyh2YWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuX2ZpbGVzID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBhY2NlcHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjZXB0O1xuICB9XG4gIHNldCBhY2NlcHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FjY2VwdCA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50O1xuICB9XG4gIHNldCBsZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHRoaXMuX2NvdW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvdW50ID0gNDtcbiAgICB9XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cbiAgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7XG4gIH1cbiAgc2V0IHNlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkZhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25JbWFnZUNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uQWRkSW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNvcnRJdGVtKCkge1xuICAgIGlmICghdGhpcy5fZmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNvdW50ID0gcGFyc2VJbnQoJycgKyB0aGlzLl9jb3VudCwgMTApO1xuICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICBjb3VudCA9IDQ7XG4gICAgfVxuICAgIGxldCBhbGxFbDogRWxlbWVudFR5cGVbXSA9IHRoaXMuX2ZpbGVzLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdpbWcnLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICd1cmwoJyArIGl0ZW0udXJsICsgJyknLFxuICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoJyArIHRoaXMuZ2V0Um90YXRpb24oaXRlbS5vcmllbnRhdGlvbikgKyAnKWRlZydcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGFibGUpIHtcbiAgICAgIGFsbEVsLnB1c2goe1xuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnJyxcbiAgICAgICAgdHJhbnNmb3JtOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGFsbEVsLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSAwICYmIGxlbmd0aCAlIGNvdW50ICE9PSAwKSB7XG4gICAgICBjb25zdCBibGFua0NvdW50ID0gY291bnQgLSAobGVuZ3RoICUgY291bnQpO1xuICAgICAgY29uc3QgZmlsbEJsYW5rRWw6IGFueVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsYW5rQ291bnQ7IGkrKykge1xuICAgICAgICBmaWxsQmxhbmtFbC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnd2hpdGUnLFxuICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogJycsXG4gICAgICAgICAgdHJhbnNmb3JtOiAnJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGFsbEVsID0gYWxsRWwuY29uY2F0KGZpbGxCbGFua0VsKTtcbiAgICB9XG4gICAgdGhpcy5mbGV4RWwgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsLmxlbmd0aCAvIGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0VsID0gYWxsRWwuc2xpY2UoaSAqIGNvdW50LCBpICogY291bnQgKyBjb3VudCk7XG4gICAgICB0aGlzLmZsZXhFbC5wdXNoKHJvd0VsKTtcbiAgICB9XG4gIH1cblxuICBhZGRJbWFnZShpbWdJdGVtOiBhbnkpIHtcbiAgICB0aGlzLl9maWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdpbWcnLFxuICAgICAgdXJsOiBpbWdJdGVtLnVybCxcbiAgICAgIG9yaWVudGF0aW9uOiBpbWdJdGVtLm9yaWVudGF0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlczogdGhpcy5fZmlsZXMsXG4gICAgICBvcGVyYXRpb25UeXBlOiAnYWRkJyxcbiAgICAgIGluZGV4OiB0aGlzLl9maWxlcy5sZW5ndGggLSAxXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVJbWFnZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlcyxcbiAgICAgIG9wZXJhdGlvblR5cGU6ICdyZW1vdmUnLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSk7XG4gIH1cblxuICBpbWFnZUNsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9uSW1hZ2VDbGljay5lbWl0KHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlc1xuICAgIH0pO1xuICB9XG5cbiAgYWRkSW1hZ2VDbGljayhlKSB7XG4gICAgdGhpcy5vbkFkZEltYWdlQ2xpY2suZW1pdChlKTtcbiAgfVxuXG4gIHBhcnNlRmlsZShmaWxlOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSAoZS50YXJnZXQgYXMgYW55KS5yZXN1bHQ7XG4gICAgICBpZiAoIWRhdGFVUkwpIHtcbiAgICAgICAgdGhpcy5vbkZhaWwuZW1pdChgRmFpbCB0byBnZXQgdGhlICR7aW5kZXh9IGltYWdlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IG9yaWVudGF0aW9uID0gMTtcbiAgICAgIHRoaXMuZ2V0T3JpZW50YXRpb24oZmlsZSwgcmVzID0+IHtcbiAgICAgICAgLy8gLTI6IG5vdCBqcGVnICwgLTE6IG5vdCBkZWZpbmVkXG4gICAgICAgIGlmIChyZXMgPiAwKSB7XG4gICAgICAgICAgb3JpZW50YXRpb24gPSByZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJbWFnZSh7XG4gICAgICAgICAgdXJsOiBkYXRhVVJMLFxuICAgICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICAgIGZpbGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgZmlsZUNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBpZiAoZmlsZUxpc3QgJiYgZmlsZUxpc3QubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucGFyc2VGaWxlKGZpbGVMaXN0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSb3RhdGlvbihvcmllbnRhdGlvbiA9IDEpIHtcbiAgICBsZXQgaW1nUm90YXRpb24gPSAwO1xuICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaW1nUm90YXRpb24gPSAxODA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDkwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgODpcbiAgICAgICAgaW1nUm90YXRpb24gPSAyNzA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gICAgcmV0dXJuIGltZ1JvdGF0aW9uO1xuICB9XG5cbiAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NTg0Nzk0L2FjY2Vzc2luZy1qcGVnLWV4aWYtcm90YXRpb24tZGF0YS1pbi1qYXZhc2NyaXB0LW9uLXRoZS1jbGllbnQtc2lkZVxuICBnZXRPcmllbnRhdGlvbihmaWxlOiBhbnksIGNhbGxiYWNrOiAoXzogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KChlLnRhcmdldCBhcyBhbnkpLnJlc3VsdCk7XG4gICAgICBpZiAodmlldy5nZXRVaW50MTYoMCwgZmFsc2UpICE9PSAweGZmZDgpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKC0yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZpZXcuYnl0ZUxlbmd0aDtcbiAgICAgIGxldCBvZmZzZXQgPSAyO1xuICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXJrZXIgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgIGlmIChtYXJrZXIgPT09IDB4ZmZlMSkge1xuICAgICAgICAgIGNvbnN0IHRtcCA9IHZpZXcuZ2V0VWludDMyKChvZmZzZXQgKz0gMiksIGZhbHNlKTtcbiAgICAgICAgICBpZiAodG1wICE9PSAweDQ1Nzg2OTY2KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soLTEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsaXR0bGUgPSB2aWV3LmdldFVpbnQxNigob2Zmc2V0ICs9IDYpLCBmYWxzZSkgPT09IDB4NDk0OTtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgbGl0dGxlKTtcbiAgICAgICAgICBjb25zdCB0YWdzID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBsaXR0bGUpO1xuICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnczsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgaSAqIDEyLCBsaXR0bGUpID09PSAweDAxMTIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGkgKiAxMiArIDgsIGxpdHRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgobWFya2VyICYgMHhmZjAwKSAhPT0gMHhmZjAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsbGJhY2soLTEpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUuc2xpY2UoMCwgNjQgKiAxMDI0KSk7XG4gIH1cbn1cbiJdfQ==