UNPKG

ng-zorro-antd-mobile

Version:

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

410 lines 30.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core'; /** * @record */ export function ElementType() { } if (false) { /** @type {?} */ ElementType.prototype.type; /** @type {?} */ ElementType.prototype.backgroundImage; /** @type {?} */ ElementType.prototype.transform; } export class ImagePickerComponent { constructor() { this.prefixCls = 'am-image-picker'; this.flexEl = []; this._accept = 'image/*'; this._count = 4; this._selectable = true; this._files = []; this._multiple = false; this.capture = false; this.disableDelete = false; this.onFail = new EventEmitter(); this.onChange = new EventEmitter(); this.onImageClick = new EventEmitter(); this.onAddImageClick = new EventEmitter(); } /** * @return {?} */ get files() { return this._files; } /** * @param {?} value * @return {?} */ set files(value) { this._files = value; this.sortItem(); } /** * @return {?} */ get accept() { return this._accept; } /** * @param {?} value * @return {?} */ set accept(value) { this._accept = value; this.sortItem(); } /** * @return {?} */ get length() { return this._count; } /** * @param {?} value * @return {?} */ set length(value) { if (value > 0) { this._count = value; } else { this._count = 4; } this.sortItem(); } /** * @return {?} */ get multiple() { return this._multiple; } /** * @param {?} value * @return {?} */ set multiple(value) { this._multiple = value; this.sortItem(); } /** * @return {?} */ get selectable() { return this._selectable; } /** * @param {?} value * @return {?} */ set selectable(value) { this._selectable = value; this.sortItem(); } /** * @return {?} */ sortItem() { if (!this._files) { return; } /** @type {?} */ let count = parseInt('' + this._count, 10); if (count <= 0) { count = 4; } /** @type {?} */ let allEl = this._files.map((/** * @param {?} item * @return {?} */ 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 {?} */ const length = allEl.length; if (length !== 0 && length % count !== 0) { /** @type {?} */ const blankCount = count - (length % count); /** @type {?} */ const fillBlankEl = []; for (let i = 0; i < blankCount; i++) { fillBlankEl.push({ type: 'white', backgroundImage: '', transform: '' }); } allEl = allEl.concat(fillBlankEl); } this.flexEl = []; for (let i = 0; i < allEl.length / count; i++) { /** @type {?} */ const rowEl = allEl.slice(i * count, i * count + count); this.flexEl.push(rowEl); } } /** * @param {?} imgItem * @return {?} */ addImage(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 {?} */ removeImage(index) { this._files.splice(index, 1); this.sortItem(); this.onChange.emit({ files: this._files, operationType: 'remove', index: index }); } /** * @param {?} index * @return {?} */ imageClick(index) { this.onImageClick.emit({ index: index, files: this._files }); } /** * @param {?} e * @return {?} */ addImageClick(e) { this.onAddImageClick.emit(e); } /** * @param {?} file * @param {?} index * @return {?} */ parseFile(file, index) { /** @type {?} */ const reader = new FileReader(); reader.onload = (/** * @param {?} e * @return {?} */ e => { /** @type {?} */ const dataURL = ((/** @type {?} */ (e.target))).result; if (!dataURL) { this.onFail.emit(`Fail to get the ${index} image`); return; } /** @type {?} */ let orientation = 1; this.getOrientation(file, (/** * @param {?} res * @return {?} */ res => { // -2: not jpeg , -1: not defined if (res > 0) { orientation = res; } this.addImage({ url: dataURL, orientation, file }); })); }); reader.readAsDataURL(file); } /** * @param {?} event * @return {?} */ fileChange(event) { /** @type {?} */ const fileList = event.target.files; if (fileList && fileList.length) { for (let i = 0; i < fileList.length; i++) { this.parseFile(fileList[i], i); } } } /** * @param {?=} orientation * @return {?} */ getRotation(orientation = 1) { /** @type {?} */ let imgRotation = 0; switch (orientation) { case 3: imgRotation = 180; break; case 6: imgRotation = 90; break; case 8: imgRotation = 270; break; default: } return imgRotation; } // https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side /** * @param {?} file * @param {?} callback * @return {?} */ getOrientation(file, callback) { /** @type {?} */ const reader = new FileReader(); reader.onload = (/** * @param {?} e * @return {?} */ e => { /** @type {?} */ const view = new DataView(((/** @type {?} */ (e.target))).result); if (view.getUint16(0, false) !== 0xffd8) { return callback(-2); } /** @type {?} */ const length = view.byteLength; /** @type {?} */ let offset = 2; while (offset < length) { /** @type {?} */ const marker = view.getUint16(offset, false); offset += 2; if (marker === 0xffe1) { /** @type {?} */ const tmp = view.getUint32((offset += 2), false); if (tmp !== 0x45786966) { return callback(-1); } /** @type {?} */ const little = view.getUint16((offset += 6), false) === 0x4949; offset += view.getUint32(offset + 4, little); /** @type {?} */ const tags = view.getUint16(offset, little); offset += 2; for (let 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)); } } ImagePickerComponent.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\n role=\"button\"\n *ngIf=\"!disableDelete\"\n aria-label=\"Click and Remove this image\"\n class=\"{{ prefixCls }}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div\n 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\n 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\n #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [attr.capture]=\"capture ? capture : null\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{ prefixCls }}-item-white\"></div>\n </FlexItem>\n </Flex>\n</div>\n" }] } ]; /** @nocollapse */ ImagePickerComponent.ctorParameters = () => []; ImagePickerComponent.propDecorators = { _fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef, static: false },] }], capture: [{ type: Input }], disableDelete: [{ type: Input }], 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 }] }; if (false) { /** @type {?} */ ImagePickerComponent.prototype.prefixCls; /** @type {?} */ ImagePickerComponent.prototype.flexEl; /** * @type {?} * @private */ ImagePickerComponent.prototype._accept; /** * @type {?} * @private */ ImagePickerComponent.prototype._count; /** * @type {?} * @private */ ImagePickerComponent.prototype._selectable; /** * @type {?} * @private */ ImagePickerComponent.prototype._files; /** * @type {?} * @private */ ImagePickerComponent.prototype._multiple; /** * @type {?} * @private */ ImagePickerComponent.prototype._fileSelectorInput; /** @type {?} */ ImagePickerComponent.prototype.capture; /** @type {?} */ ImagePickerComponent.prototype.disableDelete; /** @type {?} */ ImagePickerComponent.prototype.onFail; /** @type {?} */ ImagePickerComponent.prototype.onChange; /** @type {?} */ ImagePickerComponent.prototype.onImageClick; /** @type {?} */ ImagePickerComponent.prototype.onAddImageClick; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXBHLGlDQUlDOzs7SUFIQywyQkFBYTs7SUFDYixzQ0FBd0I7O0lBQ3hCLGdDQUFrQjs7QUFPcEIsTUFBTSxPQUFPLG9CQUFvQjtJQW9FL0I7UUFuRUEsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRXJCLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWUsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUFxQixLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUE4Q3hDLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUvQyxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyRCxvQkFBZSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXpDLENBQUM7Ozs7SUFyRGhCLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7OztJQUNELElBQUksS0FBSyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEVB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QyxDQUFDO1FBQ3RCLENBQUMsQ0FBQSxDQUFDO1FBQ0YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7OztZQTlPRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLCtCQUErQjtnQkFDekMsMjlDQUE0QzthQUM3Qzs7Ozs7aUNBV0UsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7c0JBR3hFLEtBQUs7NEJBQ0wsS0FBSztvQkFDTCxLQUFLO3FCQVFMLEtBQUs7cUJBUUwsS0FBSzt1QkFZTCxLQUFLO3lCQVFMLEtBQUs7cUJBUUwsTUFBTTt1QkFFTixNQUFNOzJCQUVOLE1BQU07OEJBRU4sTUFBTTs7OztJQWhFUCx5Q0FBc0M7O0lBQ3RDLHNDQUE2Qjs7Ozs7SUFFN0IsdUNBQW9DOzs7OztJQUNwQyxzQ0FBMkI7Ozs7O0lBQzNCLDJDQUFvQzs7Ozs7SUFDcEMsc0NBQWdDOzs7OztJQUNoQyx5Q0FBbUM7Ozs7O0lBRW5DLGtEQUM2Qzs7SUFFN0MsdUNBQTJDOztJQUMzQyw2Q0FBd0M7O0lBNkN4QyxzQ0FDK0M7O0lBQy9DLHdDQUNpRDs7SUFDakQsNENBQ3FEOztJQUNyRCwrQ0FDd0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFR5cGUge1xuICB0eXBlOiBzdHJpbmc7IC8vICdpbWcnIHwgJ3NlbGVjdCcgfCAnd2hpdGUnXG4gIGJhY2tncm91bmRJbWFnZTogc3RyaW5nO1xuICB0cmFuc2Zvcm06IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnSW1hZ2VQaWNrZXIsIG56bS1pbWFnZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVBpY2tlckNvbXBvbmVudCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLWltYWdlLXBpY2tlcic7XG4gIGZsZXhFbDogRWxlbWVudFR5cGVbXVtdID0gW107XG5cbiAgcHJpdmF0ZSBfYWNjZXB0OiBzdHJpbmcgPSAnaW1hZ2UvKic7XG4gIHByaXZhdGUgX2NvdW50OiBudW1iZXIgPSA0O1xuICBwcml2YXRlIF9zZWxlY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZmlsZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmaWxlU2VsZWN0b3JJbnB1dCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIF9maWxlU2VsZWN0b3JJbnB1dDogVmlld0NvbnRhaW5lclJlZjtcblxuICBASW5wdXQoKSBjYXB0dXJlOiBib29sZWFuIHwgc3RyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlcztcbiAgfVxuICBzZXQgZmlsZXModmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLl9maWxlcyA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgYWNjZXB0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY2VwdDtcbiAgfVxuICBzZXQgYWNjZXB0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hY2NlcHQgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb3VudDtcbiAgfVxuICBzZXQgbGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPiAwKSB7XG4gICAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb3VudCA9IDQ7XG4gICAgfVxuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICB9XG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25GYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uSW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkFkZEltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb3J0SXRlbSgpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBjb3VudCA9IHBhcnNlSW50KCcnICsgdGhpcy5fY291bnQsIDEwKTtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgY291bnQgPSA0O1xuICAgIH1cbiAgICBsZXQgYWxsRWw6IEVsZW1lbnRUeXBlW10gPSB0aGlzLl9maWxlcy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaW1nJyxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAndXJsKCcgKyBpdGVtLnVybCArICcpJyxcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyB0aGlzLmdldFJvdGF0aW9uKGl0ZW0ub3JpZW50YXRpb24pICsgJylkZWcnXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGlmICh0aGlzLl9zZWxlY3RhYmxlKSB7XG4gICAgICBhbGxFbC5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJycsXG4gICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBhbGxFbC5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggJSBjb3VudCAhPT0gMCkge1xuICAgICAgY29uc3QgYmxhbmtDb3VudCA9IGNvdW50IC0gKGxlbmd0aCAlIGNvdW50KTtcbiAgICAgIGNvbnN0IGZpbGxCbGFua0VsOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibGFua0NvdW50OyBpKyspIHtcbiAgICAgICAgZmlsbEJsYW5rRWwucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3doaXRlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICcnLFxuICAgICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhbGxFbCA9IGFsbEVsLmNvbmNhdChmaWxsQmxhbmtFbCk7XG4gICAgfVxuICAgIHRoaXMuZmxleEVsID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxFbC5sZW5ndGggLyBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dFbCA9IGFsbEVsLnNsaWNlKGkgKiBjb3VudCwgaSAqIGNvdW50ICsgY291bnQpO1xuICAgICAgdGhpcy5mbGV4RWwucHVzaChyb3dFbCk7XG4gICAgfVxuICB9XG5cbiAgYWRkSW1hZ2UoaW1nSXRlbTogYW55KSB7XG4gICAgdGhpcy5fZmlsZXMucHVzaCh7XG4gICAgICB0eXBlOiAnaW1nJyxcbiAgICAgIHVybDogaW1nSXRlbS51cmwsXG4gICAgICBvcmllbnRhdGlvbjogaW1nSXRlbS5vcmllbnRhdGlvblxuICAgIH0pO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzLFxuICAgICAgb3BlcmF0aW9uVHlwZTogJ2FkZCcsXG4gICAgICBpbmRleDogdGhpcy5fZmlsZXMubGVuZ3RoIC0gMVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2ZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlczogdGhpcy5fZmlsZXMsXG4gICAgICBvcGVyYXRpb25UeXBlOiAncmVtb3ZlJyxcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pO1xuICB9XG5cbiAgaW1hZ2VDbGljayhpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5vbkltYWdlQ2xpY2suZW1pdCh7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBmaWxlczogdGhpcy5fZmlsZXNcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEltYWdlQ2xpY2soZSkge1xuICAgIHRoaXMub25BZGRJbWFnZUNsaWNrLmVtaXQoZSk7XG4gIH1cblxuICBwYXJzZUZpbGUoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICBjb25zdCBkYXRhVVJMID0gKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0O1xuICAgICAgaWYgKCFkYXRhVVJMKSB7XG4gICAgICAgIHRoaXMub25GYWlsLmVtaXQoYEZhaWwgdG8gZ2V0IHRoZSAke2luZGV4fSBpbWFnZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IDE7XG4gICAgICB0aGlzLmdldE9yaWVudGF0aW9uKGZpbGUsIHJlcyA9PiB7XG4gICAgICAgIC8vIC0yOiBub3QganBlZyAsIC0xOiBub3QgZGVmaW5lZFxuICAgICAgICBpZiAocmVzID4gMCkge1xuICAgICAgICAgIG9yaWVudGF0aW9uID0gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW1hZ2Uoe1xuICAgICAgICAgIHVybDogZGF0YVVSTCxcbiAgICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgICBmaWxlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxuXG4gIGZpbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlTGlzdDogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgaWYgKGZpbGVMaXN0ICYmIGZpbGVMaXN0Lmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnBhcnNlRmlsZShmaWxlTGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Um90YXRpb24ob3JpZW50YXRpb24gPSAxKSB7XG4gICAgbGV0IGltZ1JvdGF0aW9uID0gMDtcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMTgwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgaW1nUm90YXRpb24gPSA5MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMjcwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICAgIHJldHVybiBpbWdSb3RhdGlvbjtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc1ODQ3OTQvYWNjZXNzaW5nLWpwZWctZXhpZi1yb3RhdGlvbi1kYXRhLWluLWphdmFzY3JpcHQtb24tdGhlLWNsaWVudC1zaWRlXG4gIGdldE9yaWVudGF0aW9uKGZpbGU6IGFueSwgY2FsbGJhY2s6IChfOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0KTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4ZmZkOCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soLTIpO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoO1xuICAgICAgbGV0IG9mZnNldCA9IDI7XG4gICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhmZmUxKSB7XG4gICAgICAgICAgY29uc3QgdG1wID0gdmlldy5nZXRVaW50MzIoKG9mZnNldCArPSAyKSwgZmFsc2UpO1xuICAgICAgICAgIGlmICh0bXAgIT09IDB4NDU3ODY5NjYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxpdHRsZSA9IHZpZXcuZ2V0VWludDE2KChvZmZzZXQgKz0gNiksIGZhbHNlKSA9PT0gMHg0OTQ5O1xuICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCBsaXR0bGUpO1xuICAgICAgICAgIGNvbnN0IHRhZ3MgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGxpdHRsZSk7XG4gICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyBpICogMTIsIGxpdHRsZSkgPT09IDB4MDExMikge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgaSAqIDEyICsgOCwgbGl0dGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXJrZXIgJiAweGZmMDApICE9PSAweGZmMDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5zbGljZSgwLCA2NCAqIDEwMjQpKTtcbiAgfVxufVxuIl19