UNPKG

ngx-serp-preview

Version:

SERP (Search Engine Result Page) Preview Component for Angular

72 lines 19.3 kB
import { ChangeDetectionStrategy, Component, ViewEncapsulation, HostBinding, Input, } from '@angular/core'; import { NgIf } from '@angular/common'; import { NgxMdIconModule } from 'ngx-md-icon'; import { mdiDotsVertical, mdiEarth } from '@mdi/js'; import * as i0 from "@angular/core"; import * as i1 from "ngx-md-icon"; export class NgxSerpGoogleMobileComponent { constructor(cdRef) { this.cdRef = cdRef; this.class = 'ngx-serp-google-mobile'; this.url = 'example.com'; this.formattedUrl = ''; this.formattedDescription = ''; this.formattedTitle = ''; this.siteIcon = mdiEarth; this.menuIcon = mdiDotsVertical; } ngOnInit() { } ngOnChanges(changes) { if (changes['url']) { this.formattedUrl = this.formatUrl(this.url); } if (changes['description'] && this.description?.length) { this.formattedDescription = this.truncateString(this.description, 155); } if (changes['title'] && this.title?.length) { this.formattedTitle = this.truncateString(this.title, 82); } } ngOnDestroy() { } formatUrl(url) { return 'https://' + url.replace(/https?:\/\//, '').replace(/\//g, ' › '); } /** * Truncate String */ truncateString(inputStr, maxLength) { const words = inputStr.split(' '); let str = ''; for (let i = 0; i < words.length; i++) { const word = words[i]; if (str.length + word.length > maxLength) { str += ' ...'; break; } else { str += ' ' + word; } } str = str.trim(); return str; } } NgxSerpGoogleMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxSerpGoogleMobileComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); NgxSerpGoogleMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NgxSerpGoogleMobileComponent, isStandalone: true, selector: "ngx-serp-google-mobile", inputs: { siteName: "siteName", title: "title", description: "description", url: "url", faviconUrl: "faviconUrl" }, host: { properties: { "class": "this.class" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-serp-google-mobile__container\">\n <div class=\"ngx-serp-google-mobile__card\">\n\n <div class=\"ngx-serp-google-mobile__header\">\n <div class=\"\">\n <div class=\"ngx-serp-google-mobile__header-icon\">\n <ng-container *ngIf=\"faviconUrl; else mdIcon\">\n <img [src]=\"faviconUrl\" fill>\n </ng-container>\n <ng-template #mdIcon>\n <md-icon [icon]=\"siteIcon\"></md-icon>\n </ng-template>\n </div>\n </div>\n <div class=\"\">\n <div class=\"ngx-serp-google-mobile__header-title\">{{ siteName }}</div>\n <div class=\"ngx-serp-google-mobile__header-url\">\n {{ formattedUrl }}\n </div>\n </div>\n <div class=\"ngx-serp-google-mobile__header-menu\">\n <md-icon [icon]=\"menuIcon\" middle></md-icon>\n </div>\n </div>\n <div class=\"ngx-serp-google-mobile__title\">{{ formattedTitle }}</div>\n <div class=\"ngx-serp-google-mobile__description\">{{ formattedDescription }}</div>\n\n </div>\n</div>\n", styles: ["body.dark .ngx-serp-google-mobile{--ngx-serp-google-mobile-site: #dadce0;--ngx-serp-google-mobile-url: #bdc1c6;--ngx-serp-google-mobile-title: #8ab4f8;--ngx-serp-google-mobile-description: #bdc1c6;--ngx-serp-google-mobile-card-gap: #34373c;--ngx-serp-google-mobile-card-border: #26282b}.ngx-serp-google-mobile{--ngx-serp-google-mobile-site: #202124;--ngx-serp-google-mobile-url: #4d5156;--ngx-serp-google-mobile-title: #1558d6;--ngx-serp-google-mobile-description: #4d5156;--ngx-serp-google-mobile-card-gap: #f1f3f4;--ngx-serp-google-mobile-card-border: #ebedef;display:block;font-family:Roboto,Helvetica Neue,Arial,sans-serif;letter-spacing:normal;font-weight:400}.ngx-serp-google-mobile__container{max-width:414px;border-top:7px solid var(--ngx-serp-google-mobile-card-gap);border-bottom:7px solid var(--ngx-serp-google-mobile-card-gap)}.ngx-serp-google-mobile__card{border-top:1px solid var(--ngx-serp-google-mobile-card-border);border-bottom:1px solid var(--ngx-serp-google-mobile-card-border);padding:15px 16px 12px}.ngx-serp-google-mobile__header{display:flex;align-items:center;justify-content:flex-start;position:relative;margin-bottom:11px}.ngx-serp-google-mobile__header-icon{margin-right:12px;background-color:#e2eeff;height:28px;width:28px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}.ngx-serp-google-mobile__header-icon .md-icon{width:18px;height:18px;font-size:18px}.ngx-serp-google-mobile__header-icon .md-icon path{color:#0060f0}.ngx-serp-google-mobile__header-icon img{width:18px;height:auto}.ngx-serp-google-mobile__header-title{font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--ngx-serp-google-mobile-site);font-size:14px;max-width:280px;display:block;line-height:20px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ngx-serp-google-mobile__header-url{font-size:12px;line-height:18px;color:var(--ngx-serp-google-mobile-url);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.ngx-serp-google-mobile__header-menu{position:absolute;right:8px;top:0}.ngx-serp-google-mobile__header-menu .md-icon{width:18px;height:18px;font-size:18px;position:relative;top:4px;left:4px}.ngx-serp-google-mobile__header-menu .md-icon path{color:var(--ngx-serp-google-mobile-url)}.ngx-serp-google-mobile__title{font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--ngx-serp-google-mobile-title);font-size:20px;font-weight:400;display:block;line-height:1.3;margin-top:5px;margin-bottom:8px}.ngx-serp-google-mobile__description{color:var(--ngx-serp-google-mobile-description);display:block;font-size:14px;line-height:1.58;word-wrap:break-word;max-width:600px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxMdIconModule }, { kind: "component", type: i1.NgxMdIconComponent, selector: "md-icon", inputs: ["icon", "icons", "texts", "middle", "xViewBox", "yViewBox", "xTextPos", "yTextPos"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxSerpGoogleMobileComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-serp-google-mobile', standalone: true, imports: [NgIf, NgxMdIconModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"ngx-serp-google-mobile__container\">\n <div class=\"ngx-serp-google-mobile__card\">\n\n <div class=\"ngx-serp-google-mobile__header\">\n <div class=\"\">\n <div class=\"ngx-serp-google-mobile__header-icon\">\n <ng-container *ngIf=\"faviconUrl; else mdIcon\">\n <img [src]=\"faviconUrl\" fill>\n </ng-container>\n <ng-template #mdIcon>\n <md-icon [icon]=\"siteIcon\"></md-icon>\n </ng-template>\n </div>\n </div>\n <div class=\"\">\n <div class=\"ngx-serp-google-mobile__header-title\">{{ siteName }}</div>\n <div class=\"ngx-serp-google-mobile__header-url\">\n {{ formattedUrl }}\n </div>\n </div>\n <div class=\"ngx-serp-google-mobile__header-menu\">\n <md-icon [icon]=\"menuIcon\" middle></md-icon>\n </div>\n </div>\n <div class=\"ngx-serp-google-mobile__title\">{{ formattedTitle }}</div>\n <div class=\"ngx-serp-google-mobile__description\">{{ formattedDescription }}</div>\n\n </div>\n</div>\n", styles: ["body.dark .ngx-serp-google-mobile{--ngx-serp-google-mobile-site: #dadce0;--ngx-serp-google-mobile-url: #bdc1c6;--ngx-serp-google-mobile-title: #8ab4f8;--ngx-serp-google-mobile-description: #bdc1c6;--ngx-serp-google-mobile-card-gap: #34373c;--ngx-serp-google-mobile-card-border: #26282b}.ngx-serp-google-mobile{--ngx-serp-google-mobile-site: #202124;--ngx-serp-google-mobile-url: #4d5156;--ngx-serp-google-mobile-title: #1558d6;--ngx-serp-google-mobile-description: #4d5156;--ngx-serp-google-mobile-card-gap: #f1f3f4;--ngx-serp-google-mobile-card-border: #ebedef;display:block;font-family:Roboto,Helvetica Neue,Arial,sans-serif;letter-spacing:normal;font-weight:400}.ngx-serp-google-mobile__container{max-width:414px;border-top:7px solid var(--ngx-serp-google-mobile-card-gap);border-bottom:7px solid var(--ngx-serp-google-mobile-card-gap)}.ngx-serp-google-mobile__card{border-top:1px solid var(--ngx-serp-google-mobile-card-border);border-bottom:1px solid var(--ngx-serp-google-mobile-card-border);padding:15px 16px 12px}.ngx-serp-google-mobile__header{display:flex;align-items:center;justify-content:flex-start;position:relative;margin-bottom:11px}.ngx-serp-google-mobile__header-icon{margin-right:12px;background-color:#e2eeff;height:28px;width:28px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}.ngx-serp-google-mobile__header-icon .md-icon{width:18px;height:18px;font-size:18px}.ngx-serp-google-mobile__header-icon .md-icon path{color:#0060f0}.ngx-serp-google-mobile__header-icon img{width:18px;height:auto}.ngx-serp-google-mobile__header-title{font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--ngx-serp-google-mobile-site);font-size:14px;max-width:280px;display:block;line-height:20px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ngx-serp-google-mobile__header-url{font-size:12px;line-height:18px;color:var(--ngx-serp-google-mobile-url);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.ngx-serp-google-mobile__header-menu{position:absolute;right:8px;top:0}.ngx-serp-google-mobile__header-menu .md-icon{width:18px;height:18px;font-size:18px;position:relative;top:4px;left:4px}.ngx-serp-google-mobile__header-menu .md-icon path{color:var(--ngx-serp-google-mobile-url)}.ngx-serp-google-mobile__title{font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--ngx-serp-google-mobile-title);font-size:20px;font-weight:400;display:block;line-height:1.3;margin-top:5px;margin-bottom:8px}.ngx-serp-google-mobile__description{color:var(--ngx-serp-google-mobile-description);display:block;font-size:14px;line-height:1.58;word-wrap:break-word;max-width:600px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { class: [{ type: HostBinding }], siteName: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], url: [{ type: Input }], faviconUrl: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlcnAtZ29vZ2xlLW1vYmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2VycC1wcmV2aWV3L3NyYy9saWIvY29tcG9uZW50cy9uZ3gtc2VycC1nb29nbGUtbW9iaWxlL25neC1zZXJwLWdvb2dsZS1tb2JpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNlcnAtcHJldmlldy9zcmMvbGliL2NvbXBvbmVudHMvbmd4LXNlcnAtZ29vZ2xlLW1vYmlsZS9uZ3gtc2VycC1nb29nbGUtbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSix1QkFBdUIsRUFDdkIsU0FBUyxFQU1ULGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsS0FBSyxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFXcEQsTUFBTSxPQUFPLDRCQUE0QjtJQTBCdEMsWUFBb0IsS0FBd0I7UUFBeEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUF4QnJDLFVBQUssR0FBRyx3QkFBd0IsQ0FBQztRQVlqQyxRQUFHLEdBQVcsYUFBYSxDQUFDO1FBSzVCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyxtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUU1QixhQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLGFBQVEsR0FBRyxlQUFlLENBQUM7SUFFYSxDQUFDO0lBRWhELFFBQVEsS0FBVSxDQUFDO0lBRW5CLFdBQVcsQ0FBQyxPQUFzQjtRQUMvQixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUU7WUFDckQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO0lBQ0osQ0FBQztJQUVELFdBQVcsS0FBVSxDQUFDO0lBRWQsU0FBUyxDQUFDLEdBQVc7UUFDMUIsT0FBTyxVQUFVLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtRQUN2RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7Z0JBQ3ZDLEdBQUcsSUFBSSxNQUFNLENBQUM7Z0JBQ2QsTUFBTTthQUNSO2lCQUFNO2dCQUNKLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO2FBQ3BCO1NBQ0g7UUFDRCxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpCLE9BQU8sR0FBRyxDQUFDO0lBQ2QsQ0FBQzs7eUhBbEVTLDRCQUE0Qjs2R0FBNUIsNEJBQTRCLDRRQzFCekMsb29DQTZCQSx3cUZEVGEsSUFBSSw0RkFBRSxlQUFlOzJGQU1yQiw0QkFBNEI7a0JBVHhDLFNBQVM7K0JBQ0csd0JBQXdCLGNBQ3RCLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsbUJBR2YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTt3R0FJOUIsS0FBSztzQkFEWCxXQUFXO2dCQUlMLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJQyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgIENvbXBvbmVudCxcbiAgIE9uSW5pdCxcbiAgIE9uRGVzdHJveSxcbiAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgT25DaGFuZ2VzLFxuICAgU2ltcGxlQ2hhbmdlcyxcbiAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgSG9zdEJpbmRpbmcsXG4gICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmd4TWRJY29uTW9kdWxlIH0gZnJvbSAnbmd4LW1kLWljb24nO1xuaW1wb3J0IHsgbWRpRG90c1ZlcnRpY2FsLCBtZGlFYXJ0aCB9IGZyb20gJ0BtZGkvanMnO1xuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnbmd4LXNlcnAtZ29vZ2xlLW1vYmlsZScsXG4gICBzdGFuZGFsb25lOiB0cnVlLFxuICAgaW1wb3J0czogW05nSWYsIE5neE1kSWNvbk1vZHVsZV0sXG4gICB0ZW1wbGF0ZVVybDogJy4vbmd4LXNlcnAtZ29vZ2xlLW1vYmlsZS5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9uZ3gtc2VycC1nb29nbGUtbW9iaWxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIE5neFNlcnBHb29nbGVNb2JpbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgIEBIb3N0QmluZGluZygpXG4gICBwdWJsaWMgY2xhc3MgPSAnbmd4LXNlcnAtZ29vZ2xlLW1vYmlsZSc7XG5cbiAgIEBJbnB1dCgpXG4gICBwdWJsaWMgc2l0ZU5hbWU/OiBzdHJpbmc7XG5cbiAgIEBJbnB1dCgpXG4gICBwdWJsaWMgdGl0bGU/OiBzdHJpbmc7XG5cbiAgIEBJbnB1dCgpXG4gICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgIEBJbnB1dCgpXG4gICBwdWJsaWMgdXJsOiBzdHJpbmcgPSAnZXhhbXBsZS5jb20nO1xuXG4gICBASW5wdXQoKVxuICAgcHVibGljIGZhdmljb25Vcmw/OiBzdHJpbmc7XG5cbiAgIHB1YmxpYyBmb3JtYXR0ZWRVcmw6IHN0cmluZyA9ICcnO1xuICAgcHVibGljIGZvcm1hdHRlZERlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgIHB1YmxpYyBmb3JtYXR0ZWRUaXRsZTogc3RyaW5nID0gJyc7XG5cbiAgIHB1YmxpYyBzaXRlSWNvbiA9IG1kaUVhcnRoO1xuICAgcHVibGljIG1lbnVJY29uID0gbWRpRG90c1ZlcnRpY2FsO1xuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlc1sndXJsJ10pIHtcbiAgICAgICAgIHRoaXMuZm9ybWF0dGVkVXJsID0gdGhpcy5mb3JtYXRVcmwodGhpcy51cmwpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXNbJ2Rlc2NyaXB0aW9uJ10gJiYgdGhpcy5kZXNjcmlwdGlvbj8ubGVuZ3RoKSB7XG4gICAgICAgICB0aGlzLmZvcm1hdHRlZERlc2NyaXB0aW9uID0gdGhpcy50cnVuY2F0ZVN0cmluZyh0aGlzLmRlc2NyaXB0aW9uLCAxNTUpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXNbJ3RpdGxlJ10gJiYgdGhpcy50aXRsZT8ubGVuZ3RoKSB7XG4gICAgICAgICB0aGlzLmZvcm1hdHRlZFRpdGxlID0gdGhpcy50cnVuY2F0ZVN0cmluZyh0aGlzLnRpdGxlLCA4Mik7XG4gICAgICB9XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCk6IHZvaWQge31cblxuICAgcHJpdmF0ZSBmb3JtYXRVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdodHRwczovLycgKyB1cmwucmVwbGFjZSgvaHR0cHM/OlxcL1xcLy8sICcnKS5yZXBsYWNlKC9cXC8vZywgJyDigLogJyk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogVHJ1bmNhdGUgU3RyaW5nXG4gICAgKi9cbiAgIHByaXZhdGUgdHJ1bmNhdGVTdHJpbmcoaW5wdXRTdHI6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgY29uc3Qgd29yZHMgPSBpbnB1dFN0ci5zcGxpdCgnICcpO1xuICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgICAgaWYgKHN0ci5sZW5ndGggKyB3b3JkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgc3RyICs9ICcgLi4uJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSAnICcgKyB3b3JkO1xuICAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcblxuICAgICAgcmV0dXJuIHN0cjtcbiAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19jb250YWluZXJcIj5cbiAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19jYXJkXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19oZWFkZXJcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19oZWFkZXItaWNvblwiPlxuICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZhdmljb25Vcmw7IGVsc2UgbWRJY29uXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZmF2aWNvblVybFwiIGZpbGw+XG4gICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWRJY29uPlxuICAgICAgICAgICAgICAgICAgPG1kLWljb24gW2ljb25dPVwic2l0ZUljb25cIj48L21kLWljb24+XG4gICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19oZWFkZXItdGl0bGVcIj57eyBzaXRlTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1zZXJwLWdvb2dsZS1tb2JpbGVfX2hlYWRlci11cmxcIj5cbiAgICAgICAgICAgICAgIHt7IGZvcm1hdHRlZFVybCB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX19oZWFkZXItbWVudVwiPlxuICAgICAgICAgICAgPG1kLWljb24gW2ljb25dPVwibWVudUljb25cIiBtaWRkbGU+PC9tZC1pY29uPlxuICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtc2VycC1nb29nbGUtbW9iaWxlX190aXRsZVwiPnt7IGZvcm1hdHRlZFRpdGxlIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXNlcnAtZ29vZ2xlLW1vYmlsZV9fZGVzY3JpcHRpb25cIj57eyBmb3JtYXR0ZWREZXNjcmlwdGlvbiB9fTwvZGl2PlxuXG4gICA8L2Rpdj5cbjwvZGl2PlxuIl19