theme-lib
Version:
This is a simple example Angular Library published to npm.
232 lines • 17.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, HostListener, Input, Output, } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
/*
* Chat form component.
*
* Show a message form with a send message button.
*
* ```ts
* <nb-chat-form showButton="true" buttonIcon="nb-send">
* </nb-chat-form>
* ```
*
* When `[dropFiles]="true"` handles files drag&drop with a file preview.
*
* Drag & drop available for files and images:
* @stacked-example(Drag & Drop Chat, chat/chat-drop.component)
*
* New message could be tracked outside by using `(send)` output.
*
* ```ts
* <nb-chat-form (send)="onNewMessage($event)">
* </nb-chat-form>
*
* // ...
*
* onNewMessage({ message: string, files: any[] }) {
* this.service.sendToServer(message, files);
* }
* ```
*
* @styles
*
* chat-form-bg:
* chat-form-fg:
* chat-form-border:
* chat-form-active-border:
*
*/
export class NbChatFormComponent {
/**
* @param {?} cd
* @param {?} domSanitizer
*/
constructor(cd, domSanitizer) {
this.cd = cd;
this.domSanitizer = domSanitizer;
this.droppedFiles = [];
this.imgDropTypes = ['image/png', 'image/jpeg', 'image/gif'];
/*
* Predefined message text
* @type {string}
*/
this.message = '';
/*
* Send button title
* @type {string}
*/
this.buttonTitle = '';
/*
* Send button icon, shown if `buttonTitle` is empty
* @type {string}
*/
this.buttonIcon = 'nb-paper-plane';
/*
* Show send button
* @type {boolean}
*/
this.showButton = true;
/*
* Show send button
* @type {boolean}
*/
this.dropFiles = false;
/*
*
* @type {EventEmitter<{ message: string, files: File[] }>}
*/
this.send = new EventEmitter();
this.fileOver = false;
}
/**
* @param {?} event
* @return {?}
*/
onDrop(event) {
if (this.dropFiles) {
event.preventDefault();
event.stopPropagation();
this.fileOver = false;
if (event.dataTransfer && event.dataTransfer.files) {
// tslint:disable-next-line
for (let file of event.dataTransfer.files) {
/** @type {?} */
const res = file;
if (this.imgDropTypes.includes(file.type)) {
/** @type {?} */
const fr = new FileReader();
fr.onload = (e) => {
res.src = e.target.result;
res.urlStyle = this.domSanitizer.bypassSecurityTrustStyle(`url(${res.src})`);
this.cd.detectChanges();
};
fr.readAsDataURL(file);
}
this.droppedFiles.push(res);
}
}
}
}
/**
* @param {?} file
* @return {?}
*/
removeFile(file) {
/** @type {?} */
const index = this.droppedFiles.indexOf(file);
if (index >= 0) {
this.droppedFiles.splice(index, 1);
}
}
/**
* @return {?}
*/
onDragOver() {
if (this.dropFiles) {
this.fileOver = true;
}
}
/**
* @return {?}
*/
onDragLeave() {
if (this.dropFiles) {
this.fileOver = false;
}
}
/**
* @return {?}
*/
sendMessage() {
if (this.droppedFiles.length || String(this.message).trim().length) {
this.send.emit({ message: this.message, files: this.droppedFiles });
this.message = '';
this.droppedFiles = [];
}
}
}
NbChatFormComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-chat-form',
template: `
<div class="dropped-files" *ngIf="droppedFiles?.length">
<ng-container *ngFor="let file of droppedFiles">
<div *ngIf="file.urlStyle" [style.background-image]="file.urlStyle">
<span class="remove" (click)="removeFile(file)">×</span>
</div>
<div *ngIf="!file.urlStyle" class="nb-compose">
<span class="remove" (click)="removeFile(file)">×</span>
</div>
</ng-container>
</div>
<div class="message-row">
<input [(ngModel)]="message"
[class.with-button]="showButton"
type="text"
placeholder="{{ fileOver ? 'Drop file to send' : 'Type a message' }}"
(keyup.enter)="sendMessage()">
<button *ngIf="showButton" class="btn" [class.with-icon]="!buttonTitle" (click)="sendMessage()">
{{ buttonTitle }}<span *ngIf="!buttonTitle" [class]="buttonIcon"></span>
</button>
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
NbChatFormComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: DomSanitizer }
];
NbChatFormComponent.propDecorators = {
message: [{ type: Input }],
buttonTitle: [{ type: Input }],
buttonIcon: [{ type: Input }],
showButton: [{ type: Input }],
dropFiles: [{ type: Input }],
send: [{ type: Output }],
fileOver: [{ type: HostBinding, args: ['class.file-over',] }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: HostListener, args: ['dragover',] }],
onDragLeave: [{ type: HostListener, args: ['dragleave',] }]
};
if (false) {
/** @type {?} */
NbChatFormComponent.prototype.droppedFiles;
/** @type {?} */
NbChatFormComponent.prototype.imgDropTypes;
/** @type {?} */
NbChatFormComponent.prototype.message;
/** @type {?} */
NbChatFormComponent.prototype.buttonTitle;
/** @type {?} */
NbChatFormComponent.prototype.buttonIcon;
/** @type {?} */
NbChatFormComponent.prototype.showButton;
/** @type {?} */
NbChatFormComponent.prototype.dropFiles;
/** @type {?} */
NbChatFormComponent.prototype.send;
/** @type {?} */
NbChatFormComponent.prototype.fileOver;
/**
* @type {?}
* @private
*/
NbChatFormComponent.prototype.cd;
/**
* @type {?}
* @private
*/
NbChatFormComponent.prototype.domSanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NoYXQvY2hhdC1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFNQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnRXpELE1BQU0sT0FBTyxtQkFBbUI7Ozs7O0lBMkM5QixZQUFvQixFQUFxQixFQUFVLFlBQTBCO1FBQXpELE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWM7UUF6QzdFLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLGlCQUFZLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDOzs7OztRQU0vQyxZQUFPLEdBQVcsRUFBRSxDQUFDOzs7OztRQU1yQixnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7Ozs7UUFNekIsZUFBVSxHQUFXLGdCQUFnQixDQUFDOzs7OztRQU10QyxlQUFVLEdBQVksSUFBSSxDQUFDOzs7OztRQU0zQixjQUFTLEdBQVksS0FBSyxDQUFDOzs7OztRQU0xQixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQXNDLENBQUM7UUFFeEMsYUFBUSxHQUFHLEtBQUssQ0FBQztJQUdqRCxDQUFDOzs7OztJQUdELE1BQU0sQ0FBQyxLQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENB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LG1DQUF3RTs7SUFFeEUsdUNBQWlEOzs7OztJQUVyQyxpQ0FBNkI7Ozs7O0lBQUUsMkNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbi8qXHJcbiAqIENoYXQgZm9ybSBjb21wb25lbnQuXHJcbiAqXHJcbiAqIFNob3cgYSBtZXNzYWdlIGZvcm0gd2l0aCBhIHNlbmQgbWVzc2FnZSBidXR0b24uXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIDxuYi1jaGF0LWZvcm0gc2hvd0J1dHRvbj1cInRydWVcIiBidXR0b25JY29uPVwibmItc2VuZFwiPlxyXG4gKiA8L25iLWNoYXQtZm9ybT5cclxuICogYGBgXHJcbiAqXHJcbiAqIFdoZW4gYFtkcm9wRmlsZXNdPVwidHJ1ZVwiYCBoYW5kbGVzIGZpbGVzIGRyYWcmZHJvcCB3aXRoIGEgZmlsZSBwcmV2aWV3LlxyXG4gKlxyXG4gKiBEcmFnICYgZHJvcCBhdmFpbGFibGUgZm9yIGZpbGVzIGFuZCBpbWFnZXM6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRHJhZyAmIERyb3AgQ2hhdCwgY2hhdC9jaGF0LWRyb3AuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBOZXcgbWVzc2FnZSBjb3VsZCBiZSB0cmFja2VkIG91dHNpZGUgYnkgdXNpbmcgYChzZW5kKWAgb3V0cHV0LlxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiA8bmItY2hhdC1mb3JtIChzZW5kKT1cIm9uTmV3TWVzc2FnZSgkZXZlbnQpXCI+XHJcbiAqIDwvbmItY2hhdC1mb3JtPlxyXG4gKlxyXG4gKiAvLyAuLi5cclxuICpcclxuICogb25OZXdNZXNzYWdlKHsgbWVzc2FnZTogc3RyaW5nLCBmaWxlczogYW55W10gfSkge1xyXG4gKiAgIHRoaXMuc2VydmljZS5zZW5kVG9TZXJ2ZXIobWVzc2FnZSwgZmlsZXMpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIGNoYXQtZm9ybS1iZzpcclxuICogY2hhdC1mb3JtLWZnOlxyXG4gKiBjaGF0LWZvcm0tYm9yZGVyOlxyXG4gKiBjaGF0LWZvcm0tYWN0aXZlLWJvcmRlcjpcclxuICpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItY2hhdC1mb3JtJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3BwZWQtZmlsZXNcIiAqbmdJZj1cImRyb3BwZWRGaWxlcz8ubGVuZ3RoXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbGUgb2YgZHJvcHBlZEZpbGVzXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImZpbGUudXJsU3R5bGVcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJmaWxlLnVybFN0eWxlXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbW92ZVwiIChjbGljayk9XCJyZW1vdmVGaWxlKGZpbGUpXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWZpbGUudXJsU3R5bGVcIiBjbGFzcz1cIm5iLWNvbXBvc2VcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoZmlsZSlcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2Utcm93XCI+XHJcbiAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cIm1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLndpdGgtYnV0dG9uXT1cInNob3dCdXR0b25cIlxyXG4gICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBmaWxlT3ZlciA/ICdEcm9wIGZpbGUgdG8gc2VuZCcgOiAnVHlwZSBhIG1lc3NhZ2UnIH19XCJcclxuICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZW5kTWVzc2FnZSgpXCI+XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93QnV0dG9uXCIgY2xhc3M9XCJidG5cIiBbY2xhc3Mud2l0aC1pY29uXT1cIiFidXR0b25UaXRsZVwiIChjbGljayk9XCJzZW5kTWVzc2FnZSgpXCI+XHJcbiAgICAgICAge3sgYnV0dG9uVGl0bGUgfX08c3BhbiAqbmdJZj1cIiFidXR0b25UaXRsZVwiIFtjbGFzc109XCJidXR0b25JY29uXCI+PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYkNoYXRGb3JtQ29tcG9uZW50IHtcclxuXHJcbiAgZHJvcHBlZEZpbGVzOiBhbnlbXSA9IFtdO1xyXG4gIGltZ0Ryb3BUeXBlcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvZ2lmJ107XHJcblxyXG4gIC8qXHJcbiAgICogUHJlZGVmaW5lZCBtZXNzYWdlIHRleHRcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKlxyXG4gICAqIFNlbmQgYnV0dG9uIHRpdGxlXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBASW5wdXQoKSBidXR0b25UaXRsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qXHJcbiAgICogU2VuZCBidXR0b24gaWNvbiwgc2hvd24gaWYgYGJ1dHRvblRpdGxlYCBpcyBlbXB0eVxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgQElucHV0KCkgYnV0dG9uSWNvbjogc3RyaW5nID0gJ25iLXBhcGVyLXBsYW5lJztcclxuXHJcbiAgLypcclxuICAgKiBTaG93IHNlbmQgYnV0dG9uXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd0J1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qXHJcbiAgICogU2hvdyBzZW5kIGJ1dHRvblxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRyb3BGaWxlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKlxyXG4gICAqXHJcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjx7IG1lc3NhZ2U6IHN0cmluZywgZmlsZXM6IEZpbGVbXSB9Pn1cclxuICAgKi9cclxuICBAT3V0cHV0KCkgc2VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBzdHJpbmcsIGZpbGVzOiBGaWxlW10gfT4oKTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maWxlLW92ZXInKSBmaWxlT3ZlciA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcikge1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXHJcbiAgb25Ecm9wKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRyb3BGaWxlcykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuZmlsZU92ZXIgPSBmYWxzZTtcclxuICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2ZlciAmJiBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpIHtcclxuXHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpIHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IGZpbGU7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaW1nRHJvcFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgZnIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICBmci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgICAgICByZXMudXJsU3R5bGUgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYHVybCgke3Jlcy5zcmN9KWApO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZnIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZHJvcHBlZEZpbGVzLnB1c2gocmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbGUoZmlsZSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRyb3BwZWRGaWxlcy5pbmRleE9mKGZpbGUpO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5kcm9wcGVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJylcclxuICBvbkRyYWdPdmVyKCkge1xyXG4gICAgaWYgKHRoaXMuZHJvcEZpbGVzKSB7XHJcbiAgICAgIHRoaXMuZmlsZU92ZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2xlYXZlJylcclxuICBvbkRyYWdMZWF2ZSgpIHtcclxuICAgIGlmICh0aGlzLmRyb3BGaWxlcykge1xyXG4gICAgICB0aGlzLmZpbGVPdmVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZW5kTWVzc2FnZSgpIHtcclxuICAgIGlmICh0aGlzLmRyb3BwZWRGaWxlcy5sZW5ndGggfHwgU3RyaW5nKHRoaXMubWVzc2FnZSkudHJpbSgpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbmQuZW1pdCh7IG1lc3NhZ2U6IHRoaXMubWVzc2FnZSwgZmlsZXM6IHRoaXMuZHJvcHBlZEZpbGVzIH0pO1xyXG4gICAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuICAgICAgdGhpcy5kcm9wcGVkRmlsZXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19