UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

139 lines 18.4 kB
import { Directive, Input, Output, EventEmitter, HostListener, HostBinding, ElementRef, Renderer2, NgZone, } from '@angular/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import * as i0 from "@angular/core"; export class TdFileDropBase { } export class TdFileDropDirective { constructor(_renderer, _element, _ngZone) { this._renderer = _renderer; this._element = _element; this._ngZone = _ngZone; this._multiple = false; this.disabled = false; /** * fileDrop?: function * Event emitted when a file or files are dropped in host element after being validated. * Emits a [FileList | File] object. */ this.fileDrop = new EventEmitter(); } /** * multiple?: boolean * Sets whether multiple files can be dropped at once in host element, or just a single file. * Can also be 'multiple' native attribute. */ set multiple(multiple) { this._multiple = coerceBooleanProperty(multiple); } /** * Binds native 'multiple' attribute if [multiple] property is 'true'. */ get multipleBinding() { return this._multiple ? '' : undefined; } /** * Binds native 'disabled' attribute if [disabled] property is 'true'. */ get disabledBinding() { return this.disabled ? '' : undefined; } ngOnInit() { this._ngZone.runOutsideAngular(() => { // Listens to 'dragenter' host event to add animation class 'drop-zone' which can be overriden in host. // Stops event propagation and default action from browser for 'dragenter' event. this._dragenterListener = this._renderer.listen(this._element.nativeElement, 'dragenter', (event) => { if (!this.disabled) { this._renderer.addClass(this._element.nativeElement, 'drop-zone'); } this._stopEvent(event); }); // Listens to 'dragleave' host event to remove animation class 'drop-zone'. // Stops event propagation and default action from browser for 'dragleave' event. this._dragleaveListener = this._renderer.listen(this._element.nativeElement, 'dragleave', (event) => { this._renderer.removeClass(this._element.nativeElement, 'drop-zone'); this._stopEvent(event); }); // Listens to 'dragover' host event to validate transfer items. // Checks if 'multiple' attr exists in host to allow multiple file drops. // Stops event propagation and default action from browser for 'dragover' event. this._dragoverListener = this._renderer.listen(this._element.nativeElement, 'dragover', (event) => { const transfer = event.dataTransfer || new DataTransfer(); transfer.dropEffect = this._typeCheck(transfer.types); if (this.disabled || (!this._multiple && ((transfer.items && transfer.items.length > 1) || transfer.mozItemCount > 1))) { transfer.dropEffect = 'none'; } else { transfer.dropEffect = 'copy'; } this._stopEvent(event); }); }); } ngOnDestroy() { this._dragenterListener?.(); this._dragleaveListener?.(); this._dragoverListener?.(); } /** * Listens to 'drop' host event to get validated transfer items. * Emits the 'fileDrop' event with a [FileList] or [File] depending if 'multiple' attr exists in host. * Stops event propagation and default action from browser for 'drop' event. */ onDrop(event) { if (!this.disabled) { const transfer = event.dataTransfer ?? new DataTransfer(); const files = transfer.files; if (files.length) { const value = this._multiple ? files.length > 1 ? files : files[0] : files[0]; this.fileDrop.emit(value); } } this._renderer.removeClass(this._element.nativeElement, 'drop-zone'); this._stopEvent(event); } /** * Validates if the transfer item types are 'Files'. */ _typeCheck(types) { let dropEffect = 'none'; if (types && ((types.contains && types.contains('Files')) || (types.indexOf && types.indexOf('Files') !== -1))) { dropEffect = 'copy'; } return dropEffect; } _stopEvent(event) { event.preventDefault(); event.stopPropagation(); } } TdFileDropDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdFileDropDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); TdFileDropDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.2", type: TdFileDropDirective, selector: "[tdFileDrop]", inputs: { multiple: "multiple", disabled: "disabled" }, outputs: { fileDrop: "fileDrop" }, host: { listeners: { "drop": "onDrop($event)" }, properties: { "attr.multiple": "this.multipleBinding", "attr.disabled": "this.disabledBinding" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TdFileDropDirective, decorators: [{ type: Directive, args: [{ selector: '[tdFileDrop]' }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { multiple: [{ type: Input }], disabled: [{ type: Input }], fileDrop: [{ type: Output }], multipleBinding: [{ type: HostBinding, args: ['attr.multiple'] }], disabledBinding: [{ type: HostBinding, args: ['attr.disabled'] }], onDrop: [{ type: HostListener, args: ['drop', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9maWxlL3NyYy9kaXJlY3RpdmVzL2ZpbGUtZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixTQUFTLEVBR1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUU5RCxNQUFNLE9BQU8sY0FBYztDQUFHO0FBRzlCLE1BQU0sT0FBTyxtQkFBbUI7SUEyQzlCLFlBQ1UsU0FBb0IsRUFDcEIsUUFBaUMsRUFDakMsT0FBZTtRQUZmLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBeUI7UUFDakMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQTdDakIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQWVqQixhQUFRLEdBQUksS0FBSyxDQUFDO1FBRTNCOzs7O1dBSUc7UUFDTyxhQUFRLEdBQWtDLElBQUksWUFBWSxFQUVqRSxDQUFDO0lBc0JELENBQUM7SUF6Q0o7Ozs7T0FJRztJQUNILElBQ0ksUUFBUSxDQUFDLFFBQTBCO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQWFEOztPQUVHO0lBQ0gsSUFDSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMs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dUJBQUMsZUFBZTtnQkEyRTVCLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBIb3N0QmluZGluZyxcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbmV4cG9ydCBjbGFzcyBUZEZpbGVEcm9wQmFzZSB7fVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbdGRGaWxlRHJvcF0nIH0pXG5leHBvcnQgY2xhc3MgVGRGaWxlRHJvcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZHJhZ2VudGVyTGlzdGVuZXI/OiBWb2lkRnVuY3Rpb247XG4gIHByaXZhdGUgX2RyYWdsZWF2ZUxpc3RlbmVyPzogVm9pZEZ1bmN0aW9uO1xuICBwcml2YXRlIF9kcmFnb3Zlckxpc3RlbmVyPzogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBtdWx0aXBsZT86IGJvb2xlYW5cbiAgICogU2V0cyB3aGV0aGVyIG11bHRpcGxlIGZpbGVzIGNhbiBiZSBkcm9wcGVkIGF0IG9uY2UgaW4gaG9zdCBlbGVtZW50LCBvciBqdXN0IGEgc2luZ2xlIGZpbGUuXG4gICAqIENhbiBhbHNvIGJlICdtdWx0aXBsZScgbmF0aXZlIGF0dHJpYnV0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBtdWx0aXBsZShtdWx0aXBsZTogYm9vbGVhbiB8IHN0cmluZykge1xuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KG11bHRpcGxlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGRpc2FibGVkPyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBmaWxlRHJvcD86IGZ1bmN0aW9uXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIGZpbGUgb3IgZmlsZXMgYXJlIGRyb3BwZWQgaW4gaG9zdCBlbGVtZW50IGFmdGVyIGJlaW5nIHZhbGlkYXRlZC5cbiAgICogRW1pdHMgYSBbRmlsZUxpc3QgfCBGaWxlXSBvYmplY3QuXG4gICAqL1xuICBAT3V0cHV0KCkgZmlsZURyb3A6IEV2ZW50RW1pdHRlcjxGaWxlTGlzdCB8IEZpbGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBGaWxlTGlzdCB8IEZpbGVcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBuYXRpdmUgJ211bHRpcGxlJyBhdHRyaWJ1dGUgaWYgW211bHRpcGxlXSBwcm9wZXJ0eSBpcyAndHJ1ZScuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIubXVsdGlwbGUnKVxuICBnZXQgbXVsdGlwbGVCaW5kaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlID8gJycgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgbmF0aXZlICdkaXNhYmxlZCcgYXR0cmlidXRlIGlmIFtkaXNhYmxlZF0gcHJvcGVydHkgaXMgJ3RydWUnLlxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpc2FibGVkJylcbiAgZ2V0IGRpc2FibGVkQmluZGluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJycgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gTGlzdGVucyB0byAnZHJhZ2VudGVyJyBob3N0IGV2ZW50IHRvIGFkZCBhbmltYXRpb24gY2xhc3MgJ2Ryb3Atem9uZScgd2hpY2ggY2FuIGJlIG92ZXJyaWRlbiBpbiBob3N0LlxuICAgICAgLy8gU3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gYW5kIGRlZmF1bHQgYWN0aW9uIGZyb20gYnJvd3NlciBmb3IgJ2RyYWdlbnRlcicgZXZlbnQuXG4gICAgICB0aGlzLl9kcmFnZW50ZXJMaXN0ZW5lciA9IHRoaXMuX3JlbmRlcmVyLmxpc3RlbihcbiAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnZHJhZ2VudGVyJyxcbiAgICAgICAgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZHJvcC16b25lJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3N0b3BFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIExpc3RlbnMgdG8gJ2RyYWdsZWF2ZScgaG9zdCBldmVudCB0byByZW1vdmUgYW5pbWF0aW9uIGNsYXNzICdkcm9wLXpvbmUnLlxuICAgICAgLy8gU3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gYW5kIGRlZmF1bHQgYWN0aW9uIGZyb20gYnJvd3NlciBmb3IgJ2RyYWdsZWF2ZScgZXZlbnQuXG4gICAgICB0aGlzLl9kcmFnbGVhdmVMaXN0ZW5lciA9IHRoaXMuX3JlbmRlcmVyLmxpc3RlbihcbiAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnZHJhZ2xlYXZlJyxcbiAgICAgICAgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Ryb3Atem9uZScpO1xuICAgICAgICAgIHRoaXMuX3N0b3BFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIExpc3RlbnMgdG8gJ2RyYWdvdmVyJyBob3N0IGV2ZW50IHRvIHZhbGlkYXRlIHRyYW5zZmVyIGl0ZW1zLlxuICAgICAgLy8gQ2hlY2tzIGlmICdtdWx0aXBsZScgYXR0ciBleGlzdHMgaW4gaG9zdCB0byBhbGxvdyBtdWx0aXBsZSBmaWxlIGRyb3BzLlxuICAgICAgLy8gU3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gYW5kIGRlZmF1bHQgYWN0aW9uIGZyb20gYnJvd3NlciBmb3IgJ2RyYWdvdmVyJyBldmVudC5cbiAgICAgIHRoaXMuX2RyYWdvdmVyTGlzdGVuZXIgPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oXG4gICAgICAgIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ2RyYWdvdmVyJyxcbiAgICAgICAgKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlcjogRGF0YVRyYW5zZmVyID1cbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2ZlciB8fCBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgdHJhbnNmZXIuZHJvcEVmZmVjdCA9IHRoaXMuX3R5cGVDaGVjayh0cmFuc2Zlci50eXBlcyk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgICAgICAgKCF0aGlzLl9tdWx0aXBsZSAmJlxuICAgICAgICAgICAgICAoKHRyYW5zZmVyLml0ZW1zICYmIHRyYW5zZmVyLml0ZW1zLmxlbmd0aCA+IDEpIHx8XG4gICAgICAgICAgICAgICAgKDxhbnk+dHJhbnNmZXIpLm1vekl0ZW1Db3VudCA+IDEpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2RyYWdlbnRlckxpc3RlbmVyPy4oKTtcbiAgICB0aGlzLl9kcmFnbGVhdmVMaXN0ZW5lcj8uKCk7XG4gICAgdGhpcy5fZHJhZ292ZXJMaXN0ZW5lcj8uKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyB0byAnZHJvcCcgaG9zdCBldmVudCB0byBnZXQgdmFsaWRhdGVkIHRyYW5zZmVyIGl0ZW1zLlxuICAgKiBFbWl0cyB0aGUgJ2ZpbGVEcm9wJyBldmVudCB3aXRoIGEgW0ZpbGVMaXN0XSBvciBbRmlsZV0gZGVwZW5kaW5nIGlmICdtdWx0aXBsZScgYXR0ciBleGlzdHMgaW4gaG9zdC5cbiAgICogU3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gYW5kIGRlZmF1bHQgYWN0aW9uIGZyb20gYnJvd3NlciBmb3IgJ2Ryb3AnIGV2ZW50LlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gIG9uRHJvcChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IHRyYW5zZmVyOiBEYXRhVHJhbnNmZXIgPVxuICAgICAgICAoPERyYWdFdmVudD5ldmVudCkuZGF0YVRyYW5zZmVyID8/IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IHRyYW5zZmVyLmZpbGVzO1xuICAgICAgaWYgKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB2YWx1ZTogRmlsZUxpc3QgfCBGaWxlID0gdGhpcy5fbXVsdGlwbGVcbiAgICAgICAgICA/IGZpbGVzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgID8gZmlsZXNcbiAgICAgICAgICAgIDogZmlsZXNbMF1cbiAgICAgICAgICA6IGZpbGVzWzBdO1xuICAgICAgICB0aGlzLmZpbGVEcm9wLmVtaXQodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdkcm9wLXpvbmUnKTtcbiAgICB0aGlzLl9zdG9wRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgdHJhbnNmZXIgaXRlbSB0eXBlcyBhcmUgJ0ZpbGVzJy5cbiAgICovXG4gIHByaXZhdGUgX3R5cGVDaGVjayhcbiAgICB0eXBlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgRE9NU3RyaW5nTGlzdFxuICApOiAnbm9uZScgfCAnY29weScgfCAnbGluaycgfCAnbW92ZScge1xuICAgIGxldCBkcm9wRWZmZWN0OiAnbm9uZScgfCAnY29weScgfCAnbGluaycgfCAnbW92ZScgPSAnbm9uZSc7XG4gICAgaWYgKFxuICAgICAgdHlwZXMgJiZcbiAgICAgICgoKDxhbnk+dHlwZXMpLmNvbnRhaW5zICYmICg8YW55PnR5cGVzKS5jb250YWlucygnRmlsZXMnKSkgfHxcbiAgICAgICAgKCg8YW55PnR5cGVzKS5pbmRleE9mICYmICg8YW55PnR5cGVzKS5pbmRleE9mKCdGaWxlcycpICE9PSAtMSkpXG4gICAgKSB7XG4gICAgICBkcm9wRWZmZWN0ID0gJ2NvcHknO1xuICAgIH1cblxuICAgIHJldHVybiBkcm9wRWZmZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RvcEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbiJdfQ==