UNPKG

ngx-toasta

Version:

Simple and clean Angular Toast component that shows growl-style notifications and messages for your web app

162 lines 17.3 kB
import { Component, Input } from '@angular/core'; import { isFunction } from './toasta.utils'; import { ToastaEventType } from './toasta.service'; import * as i0 from "@angular/core"; import * as i1 from "./toasta.service"; import * as i2 from "@angular/common"; import * as i3 from "./toast.component"; /** * Toasta is container for Toast components */ export class ToastaComponent { // The window position where the toast pops up. Possible values: // - bottom-right (default value from ToastConfig) // - bottom-left // - bottom-center // - bottom-fullwidth // - top-right // - top-left // - top-center // - top-fullwidth // - center-center set position(value) { if (value) { let notFound = true; for (let i = 0; i < ToastaComponent.POSITIONS.length; i++) { if (ToastaComponent.POSITIONS[i] === value) { notFound = false; break; } } if (notFound) { // Position was wrong - clear it here to use the one from config. value = this.config.position; } } else { value = this.config.position; } this._position = 'toasta-position-' + value; } get position() { return this._position; } constructor(config, toastaService) { this.config = config; this.toastaService = toastaService; this._position = ''; // The storage for toasts. this.toasts = []; // Initialise position this.position = ''; } /** * `ngOnInit` is called right after the directive's data-bound properties have been checked for the * first time, and before any of its children have been checked. It is invoked only once when the * directive is instantiated. */ ngOnInit() { // We listen events from our service this.toastaService.events.subscribe((event) => { if (event.type === ToastaEventType.ADD) { // Add the new one const toast = event.value; this.add(toast); } else if (event.type === ToastaEventType.CLEAR) { // Clear the one by number const id = event.value; this.clear(id); } else if (event.type === ToastaEventType.CLEAR_ALL) { // Lets clear all toasts this.clearAll(); } }); } /** * Event listener of 'closeToast' event comes from ToastaComponent. * This method removes ToastComponent assosiated with this Toast. */ closeToast(toast) { this.clear(toast.id); } /** * Add new Toast */ add(toast) { // If we've gone over our limit, remove the earliest // one from the array if (this.config.limit && this.toasts.length >= this.config.limit) { this.toasts.shift(); } // Add toasta to array this.toasts.push(toast); // // If there's a timeout individually or globally, // set the toast to timeout if (+toast.timeout) { this._setTimeout(toast); } } /** * Clear individual toast by id * @param id is unique identifier of Toast */ clear(id) { if (id) { this.toasts.forEach((value, key) => { if (value.id === id) { if (value.onRemove && isFunction(value.onRemove)) { value.onRemove.call(this, value); } this.toasts.splice(key, 1); } }); } else { throw new Error('Please provide id of Toast to close'); } } /** * Clear all toasts */ clearAll() { this.toasts.forEach((value, key) => { if (value.onRemove && isFunction(value.onRemove)) { value.onRemove.call(this, value); } }); this.toasts = []; } /** * Custom setTimeout function for specific setTimeouts on individual toasts. */ _setTimeout(toast) { window.setTimeout(() => { this.clear(toast.id); }, toast.timeout); } } /** * Set of constants defines position of Toasta on the page. */ ToastaComponent.POSITIONS = ['bottom-right', 'bottom-left', 'bottom-center', 'bottom-fullwidth', 'top-right', 'top-left', 'top-center', 'top-fullwidth', 'center-center']; ToastaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaComponent, deps: [{ token: i1.ToastaConfig }, { token: i1.ToastaService }], target: i0.ɵɵFactoryTarget.Component }); ToastaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ToastaComponent, selector: "ngx-toasta", inputs: { position: "position" }, ngImport: i0, template: ` <div id="toasta" [ngClass]="[position]"> <ngx-toast *ngFor="let toast of toasts" [toast]="toast" (closeToast)="closeToast(toast)"></ngx-toast> </div>`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.ToastComponent, selector: "ngx-toast", inputs: ["toast"], outputs: ["closeToast"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-toasta', template: ` <div id="toasta" [ngClass]="[position]"> <ngx-toast *ngFor="let toast of toasts" [toast]="toast" (closeToast)="closeToast(toast)"></ngx-toast> </div>` }] }], ctorParameters: function () { return [{ type: i1.ToastaConfig }, { type: i1.ToastaService }]; }, propDecorators: { position: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b2FzdGEvc3JjL2xpYi90b2FzdGEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQXVELGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQUV4Rzs7R0FFRztBQVFILE1BQU0sT0FBTyxlQUFlO0lBTzFCLGdFQUFnRTtJQUNoRSxrREFBa0Q7SUFDbEQsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsY0FBYztJQUNkLGFBQWE7SUFDYixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQ3hCLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekQsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtvQkFDMUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDakIsTUFBTTtpQkFDUDthQUNGO1lBQ0QsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osaUVBQWlFO2dCQUNqRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDOUI7U0FDRjthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxrQkFB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QUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDakMsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQWdCO1FBQ2xDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEIsQ0FBQzs7QUF4SUQ7O0dBRUc7QUFDSSx5QkFBUyxHQUFrQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQzs0R0FKckssZUFBZTtnR0FBZixlQUFlLG9GQUxoQjs7O1dBR0Q7MkZBRUUsZUFBZTtrQkFQM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsUUFBUSxFQUFFOzs7V0FHRDtpQkFDVjsrSEFtQkssUUFBUTtzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi90b2FzdGEudXRpbHMnO1xyXG5pbXBvcnQgeyBUb2FzdGFTZXJ2aWNlLCBUb2FzdERhdGEsIFRvYXN0YUNvbmZpZywgVG9hc3RhRXZlbnQsIFRvYXN0YUV2ZW50VHlwZSB9IGZyb20gJy4vdG9hc3RhLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFRvYXN0YSBpcyBjb250YWluZXIgZm9yIFRvYXN0IGNvbXBvbmVudHNcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LXRvYXN0YScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgaWQ9XCJ0b2FzdGFcIiBbbmdDbGFzc109XCJbcG9zaXRpb25dXCI+XHJcbiAgICAgICAgPG5neC10b2FzdCAqbmdGb3I9XCJsZXQgdG9hc3Qgb2YgdG9hc3RzXCIgW3RvYXN0XT1cInRvYXN0XCIgKGNsb3NlVG9hc3QpPVwiY2xvc2VUb2FzdCh0b2FzdClcIj48L25neC10b2FzdD5cclxuICAgIDwvZGl2PmBcclxufSlcclxuZXhwb3J0IGNsYXNzIFRvYXN0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLyoqXHJcbiAgICogU2V0IG9mIGNvbnN0YW50cyBkZWZpbmVzIHBvc2l0aW9uIG9mIFRvYXN0YSBvbiB0aGUgcGFnZS5cclxuICAgKi9cclxuICBzdGF0aWMgUE9TSVRJT05TOiBBcnJheTxzdHJpbmc+ID0gWydib3R0b20tcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLWNlbnRlcicsICdib3R0b20tZnVsbHdpZHRoJywgJ3RvcC1yaWdodCcsICd0b3AtbGVmdCcsICd0b3AtY2VudGVyJywgJ3RvcC1mdWxsd2lkdGgnLCAnY2VudGVyLWNlbnRlciddO1xyXG5cclxuICBwcml2YXRlIF9wb3NpdGlvbiA9ICcnO1xyXG4gIC8vIFRoZSB3aW5kb3cgcG9zaXRpb24gd2hlcmUgdGhlIHRvYXN0IHBvcHMgdXAuIFBvc3NpYmxlIHZhbHVlczpcclxuICAvLyAtIGJvdHRvbS1yaWdodCAoZGVmYXVsdCB2YWx1ZSBmcm9tIFRvYXN0Q29uZmlnKVxyXG4gIC8vIC0gYm90dG9tLWxlZnRcclxuICAvLyAtIGJvdHRvbS1jZW50ZXJcclxuICAvLyAtIGJvdHRvbS1mdWxsd2lkdGhcclxuICAvLyAtIHRvcC1yaWdodFxyXG4gIC8vIC0gdG9wLWxlZnRcclxuICAvLyAtIHRvcC1jZW50ZXJcclxuICAvLyAtIHRvcC1mdWxsd2lkdGhcclxuICAvLyAtIGNlbnRlci1jZW50ZXJcclxuICBASW5wdXQoKVxyXG4gIHNldCBwb3NpdGlvbih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgbGV0IG5vdEZvdW5kID0gdHJ1ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUb2FzdGFDb21wb25lbnQuUE9TSVRJT05TLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKFRvYXN0YUNvbXBvbmVudC5QT1NJVElPTlNbaV0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBub3RGb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChub3RGb3VuZCkge1xyXG4gICAgICAgIC8vIFBvc2l0aW9uIHdhcyB3cm9uZyAtIGNsZWFyIGl0IGhlcmUgdG8gdXNlIHRoZSBvbmUgZnJvbSBjb25maWcuXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvbmZpZy5wb3NpdGlvbjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLmNvbmZpZy5wb3NpdGlvbjtcclxuICAgIH1cclxuICAgIHRoaXMuX3Bvc2l0aW9uID0gJ3RvYXN0YS1wb3NpdGlvbi0nICsgdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8vIFRoZSBzdG9yYWdlIGZvciB0b2FzdHMuXHJcbiAgdG9hc3RzOiBBcnJheTxUb2FzdERhdGE+ID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBUb2FzdGFDb25maWcsIHByaXZhdGUgdG9hc3RhU2VydmljZTogVG9hc3RhU2VydmljZSkge1xyXG4gICAgLy8gSW5pdGlhbGlzZSBwb3NpdGlvblxyXG4gICAgdGhpcy5wb3NpdGlvbiA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYG5nT25Jbml0YCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIGRpcmVjdGl2ZSdzIGRhdGEtYm91bmQgcHJvcGVydGllcyBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgdGhlXHJcbiAgICogZmlyc3QgdGltZSwgYW5kIGJlZm9yZSBhbnkgb2YgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBjaGVja2VkLiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZVxyXG4gICAqIGRpcmVjdGl2ZSBpcyBpbnN0YW50aWF0ZWQuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBXZSBsaXN0ZW4gZXZlbnRzIGZyb20gb3VyIHNlcnZpY2VcclxuICAgIHRoaXMudG9hc3RhU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKChldmVudDogVG9hc3RhRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFRvYXN0YUV2ZW50VHlwZS5BREQpIHtcclxuICAgICAgICAvLyBBZGQgdGhlIG5ldyBvbmVcclxuICAgICAgICBjb25zdCB0b2FzdCA9IGV2ZW50LnZhbHVlIGFzIFRvYXN0RGF0YTtcclxuICAgICAgICB0aGlzLmFkZCh0b2FzdCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gVG9hc3RhRXZlbnRUeXBlLkNMRUFSKSB7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIG9uZSBieSBudW1iZXJcclxuICAgICAgICBjb25zdCBpZCA9IGV2ZW50LnZhbHVlIGFzIG51bWJlcjtcclxuICAgICAgICB0aGlzLmNsZWFyKGlkKTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBUb2FzdGFFdmVudFR5cGUuQ0xFQVJfQUxMKSB7XHJcbiAgICAgICAgLy8gTGV0cyBjbGVhciBhbGwgdG9hc3RzXHJcbiAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGxpc3RlbmVyIG9mICdjbG9zZVRvYXN0JyBldmVudCBjb21lcyBmcm9tIFRvYXN0YUNvbXBvbmVudC5cclxuICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIFRvYXN0Q29tcG9uZW50IGFzc29zaWF0ZWQgd2l0aCB0aGlzIFRvYXN0LlxyXG4gICAqL1xyXG4gIGNsb3NlVG9hc3QodG9hc3Q6IFRvYXN0RGF0YSkge1xyXG4gICAgdGhpcy5jbGVhcih0b2FzdC5pZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgbmV3IFRvYXN0XHJcbiAgICovXHJcbiAgYWRkKHRvYXN0OiBUb2FzdERhdGEpIHtcclxuICAgIC8vIElmIHdlJ3ZlIGdvbmUgb3ZlciBvdXIgbGltaXQsIHJlbW92ZSB0aGUgZWFybGllc3RcclxuICAgIC8vIG9uZSBmcm9tIHRoZSBhcnJheVxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxpbWl0ICYmIHRoaXMudG9hc3RzLmxlbmd0aCA+PSB0aGlzLmNvbmZpZy5saW1pdCkge1xyXG4gICAgICB0aGlzLnRvYXN0cy5zaGlmdCgpO1xyXG4gICAgfVxyXG4gICAgLy8gQWRkIHRvYXN0YSB0byBhcnJheVxyXG4gICAgdGhpcy50b2FzdHMucHVzaCh0b2FzdCk7XHJcbiAgICAvL1xyXG4gICAgLy8gSWYgdGhlcmUncyBhIHRpbWVvdXQgaW5kaXZpZHVhbGx5IG9yIGdsb2JhbGx5LFxyXG4gICAgLy8gc2V0IHRoZSB0b2FzdCB0byB0aW1lb3V0XHJcbiAgICBpZiAoK3RvYXN0LnRpbWVvdXQpIHtcclxuICAgICAgdGhpcy5fc2V0VGltZW91dCh0b2FzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBpbmRpdmlkdWFsIHRvYXN0IGJ5IGlkXHJcbiAgICogQHBhcmFtIGlkIGlzIHVuaXF1ZSBpZGVudGlmaWVyIG9mIFRvYXN0XHJcbiAgICovXHJcbiAgY2xlYXIoaWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGlkKSB7XHJcbiAgICAgIHRoaXMudG9hc3RzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUub25SZW1vdmUgJiYgaXNGdW5jdGlvbih2YWx1ZS5vblJlbW92ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUub25SZW1vdmUuY2FsbCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnRvYXN0cy5zcGxpY2Uoa2V5LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBpZCBvZiBUb2FzdCB0byBjbG9zZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHRvYXN0c1xyXG4gICAqL1xyXG4gIGNsZWFyQWxsKCkge1xyXG4gICAgdGhpcy50b2FzdHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBpZiAodmFsdWUub25SZW1vdmUgJiYgaXNGdW5jdGlvbih2YWx1ZS5vblJlbW92ZSkpIHtcclxuICAgICAgICB2YWx1ZS5vblJlbW92ZS5jYWxsKHRoaXMsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRvYXN0cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHNldFRpbWVvdXQgZnVuY3Rpb24gZm9yIHNwZWNpZmljIHNldFRpbWVvdXRzIG9uIGluZGl2aWR1YWwgdG9hc3RzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NldFRpbWVvdXQodG9hc3Q6IFRvYXN0RGF0YSkge1xyXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFyKHRvYXN0LmlkKTtcclxuICAgIH0sIHRvYXN0LnRpbWVvdXQpO1xyXG4gIH1cclxufVxyXG4iXX0=