UNPKG

@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>

289 lines 18.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @type {?} */ const noop = (/** * @return {?} */ () => { }); const ɵ0 = noop; export class FileUploader { constructor() { /** * 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++; } /** * Specifies the property to be used as the return value to `ngModel` * @return {?} */ get value() { return this.files; } /** * @param {?} v * @return {?} */ set value(v) { if (v !== this.files) { this.files = v; this.onChangeCallback(v); } } /** * @return {?} */ onBlur() { this.onTouchedCallback(); } /** * Propagates the injected `value`. * @param {?} value * @return {?} */ writeValue(value) { if (value !== this.value) { this.files = value; } } /** * @return {?} */ onFilesAdded() { /** @type {?} */ const files = this.fileInput.nativeElement.files; if (!this.multiple) { this.files.clear(); } for (let file of files) { /** @type {?} */ const fileItem = { file, uploaded: false, state: 'edit', invalid: false, invalidText: '', }; this.files.add(fileItem); this.filesChange.emit(this.files); } this.value = this.files; } /** * @param {?} fileItem * @return {?} */ removeFile(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`. * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouchedCallback = fn; } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ registerOnChange(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: ` <ng-container *ngIf="!skeleton; else skeletonTemplate"> <label class="label">{{title}}</label> <div *ngIf="description" class="form__helper-text">{{description}}</div> <div class="file"> <button type="button" [sukaButton]="buttonType" (click)="fileInput.click()" [attr.for]="fileUploaderId" [size]="size"> {{buttonText}} </button> <input #fileInput type="file" class="file-input" [accept]="accept" [id]="fileUploaderId" [multiple]="multiple" tabindex="-1" (change)="onFilesAdded()"/> <div class="file-container"> <div *ngFor="let fileItem of files"> <suka-file [fileItem]="fileItem" (remove)="removeFile(fileItem)"></suka-file> <div *ngIf="fileItem.invalid" class="form-requirement"> {{fileItem.invalidText}} </div> </div> </div> </div> </ng-container> <ng-template #skeletonTemplate> <div class="skeleton__text" style="width: 100px"></div> <div class="skeleton__text" style="width: 225px"></div> <button sukaButton skeleton="true"></button> </ng-template> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: FileUploader, multi: true } ] }] } ]; /** @nocollapse */ FileUploader.ctorParameters = () => []; 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',] }] }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUk3QyxJQUFJOzs7QUFBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7O0FBa0RyQixNQUFNLE9BQU8sWUFBWTtJQXdFdkI7Ozs7UUFoRVMsZUFBVSxHQUFHLG9CQUFvQixDQUFDOzs7O1FBS2xDLGVBQVUsR0FBb0UsT0FBTyxDQUFDOzs7O1FBZXRGLFdBQU0sR0FBRyxFQUFFLENBQUM7Ozs7OztRQU9aLGFBQVEsR0FBRyxJQUFJLENBQUM7Ozs7UUFLaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQVVqQixtQkFBYyxHQUFHLGlCQUFpQixZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7OztRQVVuRSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVksQ0FBQzs7OztRQUszQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFWixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTNDLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBK0IsSUFBSSxDQUFDO1FBRzVELFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7Ozs7O0lBS0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Ozs7O0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEtBQUss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O0lBRXJELHlDQUErQzs7Ozs7SUFDL0Msd0NBQThEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmlsZUl0ZW0gfSBmcm9tICcuL2ZpbGUtaXRlbS5pbnRlcmZhY2UnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtZmlsZS11cGxvYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPnt7dGl0bGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3N1a2FCdXR0b25dPVwiYnV0dG9uVHlwZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICBbYXR0ci5mb3JdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFtzaXplXT1cInNpemVcIj5cbiAgICAgICAgICB7e2J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXB0XCJcbiAgICAgICAgICBbaWRdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVzQWRkZWQoKVwiLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZUl0ZW0gb2YgZmlsZXNcIj5cbiAgICAgICAgICAgIDxzdWthLWZpbGUgW2ZpbGVJdGVtXT1cImZpbGVJdGVtXCIgKHJlbW92ZSk9XCJyZW1vdmVGaWxlKGZpbGVJdGVtKVwiPjwvc3VrYS1maWxlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVJdGVtLmludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgICAgICAge3tmaWxlSXRlbS5pbnZhbGlkVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMjI1cHhcIj48L2Rpdj5cbiAgICAgIDxidXR0b24gc3VrYUJ1dHRvbiBza2VsZXRvbj1cInRydWVcIj48L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBGaWxlVXBsb2FkZXIsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xuICAvKipcbiAgICogQ291bnRlciB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzIGZvciBmaWxlLXVwbG9hZGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHN0YXRpYyBmaWxlVXBsb2FkZXJDb3VudCA9IDA7XG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIHRleHQgZm9yIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgdXBsb2FkIHdpbmRvdy5cbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQgPSAnQWdyZWdhciBhcmNoaXZvKHMpJztcblxuICAvKipcbiAgICogVHlwZSBzZXQgZm9yIGJ1dHRvblxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVHlwZTogJ3ByaW1hcnknIHwgJ2Jhc2ljJyB8ICdwbGFpbicgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmVfd2hpdGUnID0gJ2Jhc2ljJztcblxuICAvKipcbiAgICogVGV4dCBzZXQgdG8gdGhlIHRpdGxlXG4gICAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGVzIG9mIGZpbGVzIHRoYXQgdGhlIGlucHV0IHNob3VsZCBiZSBhYmxlIHRvIHJlY2VpdmVcbiAgICovXG4gIEBJbnB1dCgpIGFjY2VwdCA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byB0ZWxsIHRoZSBjb21wb25lbnQgdG8gb25seSBhY2NlcHQgYSBzaW5nbGUgZmlsZSBvbiB1cGxvYWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC4gQWNjZXB0cyBtdWx0aXBsZSBmaWxlcy5cbiAgICovXG4gIEBJbnB1dCgpIG11bHRpcGxlID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIGZpbGUgdXBsb2FkZXIuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ25vcm1hbCc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgdW5pcXVlIGlkIGZvciB0aGUgdW5kZXJseWluZyBgPGlucHV0PmAgbm9kZVxuICAgKi9cbiAgQElucHV0KCkgZmlsZVVwbG9hZGVySWQgPSBgZmlsZS11cGxvYWRlci0ke0ZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudH1gO1xuXG4gIC8qKlxuICAgKiBNYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgRE9NIGVsZW1lbnQgb2YgdGhlIHVuZGVybHlpbmcgYDxpbnB1dD5gIG5vZGVcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSkgZmlsZUlucHV0O1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYmUgdXBsb2FkZWRcbiAgICovXG4gIEBJbnB1dCgpIGZpbGVzID0gbmV3IFNldDxGaWxlSXRlbT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgdG8gb3RoZXIgY2xhc3NlcyB3aGVuIGZpbGVzIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maWxlLXVwbG9hZGVyJykgYmFzZUNsYXNzID0gdHJ1ZTtcblxuICBwcm90ZWN0ZWQgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcm90ZWN0ZWQgb25DaGFuZ2VDYWxsYmFjazogKF86IFNldDxGaWxlSXRlbT4pID0+IHZvaWQgPSBub29wO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIEZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcHJvcGVydHkgdG8gYmUgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGBuZ01vZGVsYFxuICAgKi9cbiAgZ2V0IHZhbHVlKCk6IFNldDxGaWxlSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmZpbGVzO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBTZXQ8RmlsZUl0ZW0+KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuZmlsZXMpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSB2O1xuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvcGFnYXRlcyB0aGUgaW5qZWN0ZWQgYHZhbHVlYC5cbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBvbkZpbGVzQWRkZWQoKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5maWxlcy5jbGVhcigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlSXRlbTogRmlsZUl0ZW0gPSB7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIHVwbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6ICdlZGl0JyxcbiAgICAgICAgaW52YWxpZDogZmFsc2UsXG4gICAgICAgIGludmFsaWRUZXh0OiAnJyxcbiAgICAgIH07XG4gICAgICB0aGlzLmZpbGVzLmFkZChmaWxlSXRlbSk7XG4gICAgICB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZmlsZXM7XG4gIH1cblxuICByZW1vdmVGaWxlKGZpbGVJdGVtKSB7XG4gICAgdGhpcy5maWxlcy5kZWxldGUoZmlsZUl0ZW0pO1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBpbmplY3RlZCBmdW5jdGlvbiB0byBjb250cm9sIHRoZSB0b3VjaCB1c2Ugb2YgdGhlIGBGaWxlVXBsb2FkZXJgLlxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIG1ldGhvZCBpbiBvcmRlciB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cbn1cbiJdfQ==