@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
307 lines • 20.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
var noop = (/**
* @return {?}
*/
function () { });
var ɵ0 = noop;
var FileUploader = /** @class */ (function () {
function FileUploader() {
/**
* Accessible text for the button that opens the upload window.
*/
this.buttonText = 'Agregar archivo(s)';
/**
* Type set for button
*/
this.buttonType = 'basic';
/**
* Specify the types of files that the input should be able to receive
*/
this.accept = [];
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
*/
this.multiple = true;
/**
* Set to `true` for a loading file uploader.
*/
this.skeleton = false;
/**
* Provides a unique id for the underlying `<input>` node
*/
this.fileUploaderId = "file-uploader-" + FileUploader.fileUploaderCount;
/**
* The list of files that have been submitted to be uploaded
*/
this.files = new Set();
/**
* Emits an event to other classes when files change
*/
this.filesChange = new EventEmitter();
this.baseClass = true;
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
FileUploader.fileUploaderCount++;
}
Object.defineProperty(FileUploader.prototype, "value", {
/**
* Specifies the property to be used as the return value to `ngModel`
*/
get: /**
* Specifies the property to be used as the return value to `ngModel`
* @return {?}
*/
function () {
return this.files;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (v !== this.files) {
this.files = v;
this.onChangeCallback(v);
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FileUploader.prototype.onBlur = /**
* @return {?}
*/
function () {
this.onTouchedCallback();
};
/**
* Propagates the injected `value`.
*/
/**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
FileUploader.prototype.writeValue = /**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this.value) {
this.files = value;
}
};
/**
* @return {?}
*/
FileUploader.prototype.onFilesAdded = /**
* @return {?}
*/
function () {
var e_1, _a;
/** @type {?} */
var files = this.fileInput.nativeElement.files;
if (!this.multiple) {
this.files.clear();
}
try {
for (var files_1 = tslib_1.__values(files), files_1_1 = files_1.next(); !files_1_1.done; files_1_1 = files_1.next()) {
var file = files_1_1.value;
/** @type {?} */
var fileItem = {
file: file,
uploaded: false,
state: 'edit',
invalid: false,
invalidText: '',
};
this.files.add(fileItem);
this.filesChange.emit(this.files);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1);
}
finally { if (e_1) throw e_1.error; }
}
this.value = this.files;
};
/**
* @param {?} fileItem
* @return {?}
*/
FileUploader.prototype.removeFile = /**
* @param {?} fileItem
* @return {?}
*/
function (fileItem) {
this.files.delete(fileItem);
this.fileInput.nativeElement.value = '';
this.filesChange.emit(this.files);
};
/**
* Registers the injected function to control the touch use of the `FileUploader`.
*/
/**
* Registers the injected function to control the touch use of the `FileUploader`.
* @param {?} fn
* @return {?}
*/
FileUploader.prototype.registerOnTouched = /**
* Registers the injected function to control the touch use of the `FileUploader`.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* Sets a method in order to propagate changes back to the form.
*/
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
FileUploader.prototype.registerOnChange = /**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* Counter used to create unique ids for file-uploader components
*/
FileUploader.fileUploaderCount = 0;
FileUploader.decorators = [
{ type: Component, args: [{
selector: 'suka-file-uploader',
template: "\n <ng-container *ngIf=\"!skeleton; else skeletonTemplate\">\n <label class=\"label\">{{title}}</label>\n <div *ngIf=\"description\" class=\"form__helper-text\">{{description}}</div>\n <div class=\"file\">\n <button\n type=\"button\"\n [sukaButton]=\"buttonType\"\n (click)=\"fileInput.click()\"\n [attr.for]=\"fileUploaderId\"\n [size]=\"size\">\n {{buttonText}}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"file-input\"\n [accept]=\"accept\"\n [id]=\"fileUploaderId\"\n [multiple]=\"multiple\"\n tabindex=\"-1\"\n (change)=\"onFilesAdded()\"/>\n <div class=\"file-container\">\n <div *ngFor=\"let fileItem of files\">\n <suka-file [fileItem]=\"fileItem\" (remove)=\"removeFile(fileItem)\"></suka-file>\n <div *ngIf=\"fileItem.invalid\" class=\"form-requirement\">\n {{fileItem.invalidText}}\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #skeletonTemplate>\n <div class=\"skeleton__text\" style=\"width: 100px\"></div>\n <div class=\"skeleton__text\" style=\"width: 225px\"></div>\n <button sukaButton skeleton=\"true\"></button>\n </ng-template>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: FileUploader,
multi: true
}
]
}] }
];
/** @nocollapse */
FileUploader.ctorParameters = function () { return []; };
FileUploader.propDecorators = {
buttonText: [{ type: Input }],
buttonType: [{ type: Input }],
title: [{ type: Input }],
description: [{ type: Input }],
accept: [{ type: Input }],
multiple: [{ type: Input }],
skeleton: [{ type: Input }],
size: [{ type: Input }],
fileUploaderId: [{ type: Input }],
fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
baseClass: [{ type: HostBinding, args: ['class.file-uploader',] }]
};
return FileUploader;
}());
export { FileUploader };
if (false) {
/**
* Counter used to create unique ids for file-uploader components
* @type {?}
*/
FileUploader.fileUploaderCount;
/**
* Accessible text for the button that opens the upload window.
* @type {?}
*/
FileUploader.prototype.buttonText;
/**
* Type set for button
* @type {?}
*/
FileUploader.prototype.buttonType;
/**
* Text set to the title
* @type {?}
*/
FileUploader.prototype.title;
/**
* Text set to the description
* @type {?}
*/
FileUploader.prototype.description;
/**
* Specify the types of files that the input should be able to receive
* @type {?}
*/
FileUploader.prototype.accept;
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
* @type {?}
*/
FileUploader.prototype.multiple;
/**
* Set to `true` for a loading file uploader.
* @type {?}
*/
FileUploader.prototype.skeleton;
/**
* Sets the size of the button.
* @type {?}
*/
FileUploader.prototype.size;
/**
* Provides a unique id for the underlying `<input>` node
* @type {?}
*/
FileUploader.prototype.fileUploaderId;
/**
* Maintains a reference to the view DOM element of the underlying `<input>` node
* @type {?}
*/
FileUploader.prototype.fileInput;
/**
* The list of files that have been submitted to be uploaded
* @type {?}
*/
FileUploader.prototype.files;
/**
* Emits an event to other classes when files change
* @type {?}
*/
FileUploader.prototype.filesChange;
/** @type {?} */
FileUploader.prototype.baseClass;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onTouchedCallback;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onChangeCallback;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFJN0MsSUFBSTs7O0FBQUcsY0FBTyxDQUFDLENBQUE7O0FBRXJCO0lBd0hFOzs7O1FBaEVTLGVBQVUsR0FBRyxvQkFBb0IsQ0FBQzs7OztRQUtsQyxlQUFVLEdBQW9FLE9BQU8sQ0FBQzs7OztRQWV0RixXQUFNLEdBQUcsRUFBRSxDQUFDOzs7Ozs7UUFPWixhQUFRLEdBQUcsSUFBSSxDQUFDOzs7O1FBS2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFVakIsbUJBQWMsR0FBRyxtQkFBaUIsWUFBWSxDQUFDLGlCQUFtQixDQUFDOzs7O1FBVW5FLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBWSxDQUFDOzs7O1FBSzNCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVaLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFM0Msc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUErQixJQUFJLENBQUM7UUFHNUQsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUtELHNCQUFJLCtCQUFLO1FBSFQ7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzs7Ozs7UUFDRCxVQUFVLENBQWdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JB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Ozs7OztJQU9yQixnQ0FBeUI7Ozs7O0lBS3pCLGdDQUEwQjs7Ozs7SUFLMUIsNEJBQStCOzs7OztJQUsvQixzQ0FBNEU7Ozs7O0lBSzVFLGlDQUFtRDs7Ozs7SUFLbkQsNkJBQXFDOzs7OztJQUtyQyxtQ0FBZ0Q7O0lBRWhELGlDQUFxRDs7Ozs7SUFFckQseUNBQStDOzs7OztJQUMvQyx3Q0FBOEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZ1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGaWxlSXRlbSB9IGZyb20gJy4vZmlsZS1pdGVtLmludGVyZmFjZSc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1maWxlLXVwbG9hZGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uOyBlbHNlIHNrZWxldG9uVGVtcGxhdGVcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+e3t0aXRsZX19PC9sYWJlbD5cbiAgICAgIDxkaXYgKm5nSWY9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbc3VrYUJ1dHRvbl09XCJidXR0b25UeXBlXCJcbiAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIFthdHRyLmZvcl09XCJmaWxlVXBsb2FkZXJJZFwiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiPlxuICAgICAgICAgIHt7YnV0dG9uVGV4dH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjZmlsZUlucHV0XG4gICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgIGNsYXNzPVwiZmlsZS1pbnB1dFwiXG4gICAgICAgICAgW2FjY2VwdF09XCJhY2NlcHRcIlxuICAgICAgICAgIFtpZF09XCJmaWxlVXBsb2FkZXJJZFwiXG4gICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZXNBZGRlZCgpXCIvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlSXRlbSBvZiBmaWxlc1wiPlxuICAgICAgICAgICAgPHN1a2EtZmlsZSBbZmlsZUl0ZW1dPVwiZmlsZUl0ZW1cIiAocmVtb3ZlKT1cInJlbW92ZUZpbGUoZmlsZUl0ZW0pXCI+PC9zdWthLWZpbGU+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsZUl0ZW0uaW52YWxpZFwiIGNsYXNzPVwiZm9ybS1yZXF1aXJlbWVudFwiPlxuICAgICAgICAgICAgICB7e2ZpbGVJdGVtLmludmFsaWRUZXh0fX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2tlbGV0b25UZW1wbGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbl9fdGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAyMjVweFwiPjwvZGl2PlxuICAgICAgPGJ1dHRvbiBzdWthQnV0dG9uIHNrZWxldG9uPVwidHJ1ZVwiPjwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IEZpbGVVcGxvYWRlcixcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XG4gIC8qKlxuICAgKiBDb3VudGVyIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSBpZHMgZm9yIGZpbGUtdXBsb2FkZXIgY29tcG9uZW50c1xuICAgKi9cbiAgc3RhdGljIGZpbGVVcGxvYWRlckNvdW50ID0gMDtcbiAgLyoqXG4gICAqIEFjY2Vzc2libGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiB0aGF0IG9wZW5zIHRoZSB1cGxvYWQgd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdBZ3JlZ2FyIGFyY2hpdm8ocyknO1xuXG4gIC8qKlxuICAgKiBUeXBlIHNldCBmb3IgYnV0dG9uXG4gICAqL1xuICBASW5wdXQoKSBidXR0b25UeXBlOiAncHJpbWFyeScgfCAnYmFzaWMnIHwgJ3BsYWluJyB8ICdkZXN0cnVjdGl2ZScgfCAnb3V0bGluZV93aGl0ZScgPSAnYmFzaWMnO1xuXG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgdGl0bGVcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdHlwZXMgb2YgZmlsZXMgdGhhdCB0aGUgaW5wdXQgc2hvdWxkIGJlIGFibGUgdG8gcmVjZWl2ZVxuICAgKi9cbiAgQElucHV0KCkgYWNjZXB0ID0gW107XG5cbiAgLyoqXG4gICAqIFNldCB0byBgZmFsc2VgIHRvIHRlbGwgdGhlIGNvbXBvbmVudCB0byBvbmx5IGFjY2VwdCBhIHNpbmdsZSBmaWxlIG9uIHVwbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBBY2NlcHRzIG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgZmlsZSB1cGxvYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbi5cbiAgICovXG4gIEBJbnB1dCgpIHNpemU6ICdzbScgfCAnbm9ybWFsJztcblxuICAvKipcbiAgICogUHJvdmlkZXMgYSB1bmlxdWUgaWQgZm9yIHRoZSB1bmRlcmx5aW5nIGA8aW5wdXQ+YCBub2RlXG4gICAqL1xuICBASW5wdXQoKSBmaWxlVXBsb2FkZXJJZCA9IGBmaWxlLXVwbG9hZGVyLSR7RmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50fWA7XG5cbiAgLyoqXG4gICAqIE1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmlldyBET00gZWxlbWVudCBvZiB0aGUgdW5kZXJseWluZyBgPGlucHV0PmAgbm9kZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0Jywge3N0YXRpYzogZmFsc2V9KSBmaWxlSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgQElucHV0KCkgZmlsZXMgPSBuZXcgU2V0PEZpbGVJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB0byBvdGhlciBjbGFzc2VzIHdoZW4gZmlsZXMgY2hhbmdlXG4gICAqL1xuICBAT3V0cHV0KCkgZmlsZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtdXBsb2FkZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByb3RlY3RlZCBvbkNoYW5nZUNhbGxiYWNrOiAoXzogU2V0PEZpbGVJdGVtPikgPT4gdm9pZCA9IG5vb3A7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgRmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSB0byBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgdG8gYG5nTW9kZWxgXG4gICAqL1xuICBnZXQgdmFsdWUoKTogU2V0PEZpbGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXM7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodiAhPT0gdGhpcy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodik7XG4gICAgfVxuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIHRoZSBpbmplY3RlZCBgdmFsdWVgLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsZXNBZGRlZCgpIHtcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXM7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmZpbGVzLmNsZWFyKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVJdGVtOiBGaWxlSXRlbSA9IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogJ2VkaXQnLFxuICAgICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgaW52YWxpZFRleHQ6ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsZXMuYWRkKGZpbGVJdGVtKTtcbiAgICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5maWxlcztcbiAgfVxuXG4gIHJlbW92ZUZpbGUoZmlsZUl0ZW0pIHtcbiAgICB0aGlzLmZpbGVzLmRlbGV0ZShmaWxlSXRlbSk7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGluamVjdGVkIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHRvdWNoIHVzZSBvZiB0aGUgYEZpbGVVcGxvYWRlcmAuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxufVxuIl19