UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

241 lines (222 loc) 18.4 kB
import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { Component, Inject, Input, PLATFORM_ID } from '@angular/core'; import { PdfBreakpoints } from '../responsive-visibility'; import { addTrustedHTML } from '../theme/sanitized-css-injector'; import * as i0 from "@angular/core"; export class DynamicCssComponent { renderer; document; platformId; zoom = 1.0; width = 3.14159265359; xxs = 455; xs = 490; sm = 560; md = 610; lg = 660; xl = 740; xxl = 830; get style() { return ` #toolbarContainer .always-in-secondary-menu { display: none; } #secondaryToolbar .always-in-secondary-menu { display: inline-flex; } #outerContainer #mainContainer .visibleXXSView, #outerContainer #mainContainer .visibleTinyView, #outerContainer #mainContainer .visibleSmallView, #outerContainer #mainContainer .visibleMediumView, #outerContainer #mainContainer .visibleLargeView, #outerContainer #mainContainer .visibleXLView, #outerContainer #mainContainer .visibleXXLView { display: none; } @media all and (max-width: ${this.xl}px) { #toolbarViewerMiddle { display: table; margin: auto; left: auto; position: inherit; transform: none; } } @media all and (max-width: ${this.xxl}) { #sidebarContent { background-color: rgba(0, 0, 0, 0.7); } html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer { left: 0px !important; } html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer { right: 0px !important; } #outerContainer .hiddenLargeView, #outerContainer .hiddenMediumView { display: inherit; } } @media all and (max-width: ${this.lg}px) { .toolbarButtonSpacer { width: 15px; } #outerContainer .hiddenLargeView { display: none; } #outerContainer #mainContainer .visibleLargeView { display: inherit; } } @media all and (max-width: ${this.md}px) { .toolbarButtonSpacer { display: none; } #outerContainer .hiddenMediumView { display: none; } #outerContainer #mainContainer .visibleMediumView { display: inherit; } } @media all and (max-width: ${this.sm}px) { #outerContainer .hiddenSmallView, #outerContainer .hiddenSmallView * { display: none; } #outerContainer #mainContainer .visibleSmallView { display: inherit; } .toolbarButtonSpacer { width: 0; } html[dir='ltr'] .findbar { left: 38px; } html[dir='rtl'] .findbar { right: 38px; } } @media all and (max-width: ${this.sm}px) { #scaleSelectContainer { display: none; } } #outerContainer .visibleXLView, #outerContainer .visibleXXLView, #outerContainer .visibleTinyView { display: none; } #outerContainer .hiddenXLView, #outerContainer .hiddenXXLView { display: unset; } @media all and (max-width: ${this.xl}px) { #outerContainer .hiddenXLView { display: none; } #outerContainer .visibleXLView { display: inherit; } #toolbarViewerMiddle { -webkit-transform: translateX(-36%); transform: translateX(-36%); display: unset; margin: unset; left: 50%; position: absolute; } } @media all and (max-width: ${this.xxl}px) { #outerContainer .hiddenXXLView { display: none; } #outerContainer #mainContainer .visibleXXLView { display: inherit; } } @media all and (max-width: ${this.md}px) { #toolbarViewerMiddle { -webkit-transform: translateX(-26%); transform: translateX(-26%); } } @media all and (max-width: ${this.xs}px) { #outerContainer .hiddenTinyView, #outerContainer .hiddenTinyView * { display: none; } #outerContainer #mainContainer .visibleTinyView { display: inherit; } } @media all and (max-width: ${this.xxs}px) { #outerContainer .hiddenXXSView, #outerContainer .hiddenXXSView * { display: none; } #outerContainer #mainContainer .visibleXXSView { display: inherit; } } `; } constructor(renderer, document, platformId) { this.renderer = renderer; this.document = document; this.platformId = platformId; if (isPlatformBrowser(this.platformId)) { this.width = document.body.clientWidth; } } ngOnInit() { this.injectStyle(); } ngOnChanges() { const fullWith = this.document.body.clientWidth; const partialViewScale = fullWith / this.width; const scaleFactor = partialViewScale * (this.zoom ? this.zoom : 1); this.xs = scaleFactor * PdfBreakpoints.xs; this.sm = scaleFactor * PdfBreakpoints.sm; this.md = scaleFactor * PdfBreakpoints.md; this.lg = scaleFactor * PdfBreakpoints.lg; this.xl = scaleFactor * PdfBreakpoints.xl; this.xxl = scaleFactor * PdfBreakpoints.xxl; let styles = this.document.getElementById('pdf-dynamic-css'); if (!styles) { styles = this.document.createElement('STYLE'); styles.id = 'pdf-dynamic-css'; addTrustedHTML(styles, this.style); this.renderer.appendChild(this.document.head, styles); } addTrustedHTML(styles, this.style); } injectStyle() { if (this.width === 3.14159265359) { setTimeout(() => this.ngOnChanges(), 1); } } ngOnDestroy() { const styles = this.document.getElementById('pdf-dynamic-css'); if (styles?.parentElement) { styles.parentElement.removeChild(styles); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: DynamicCssComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: DynamicCssComponent, selector: "pdf-dynamic-css", inputs: { zoom: "zoom", width: "width" }, usesOnChanges: true, ngImport: i0, template: "", styles: [""] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: DynamicCssComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-dynamic-css', template: "" }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }], propDecorators: { zoom: [{ type: Input }], width: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9keW5hbWljLWNzcy9keW5hbWljLWNzcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL2R5bmFtaWMtY3NzL2R5bmFtaWMtY3NzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWdDLFdBQVcsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQU9qRSxNQUFNLE9BQU8sbUJBQW1CO0lBMExWO0lBQStDO0lBQWlEO0lBeEw3RyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBR1gsS0FBSyxHQUFHLGFBQWEsQ0FBQztJQUV0QixHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRVYsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFVCxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBRVQsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFVCxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWpCLElBQVcsS0FBSztRQUNkLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBbUJrQixJQUFJLENBQUMsRUFBRTs7Ozs7Ozs7Ozs2QkFVUCxJQUFJLENBQUMsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQWtCUixJQUFJLENB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QWEsRUFBRTtZQUN4QixNQUFNLENBQUMsYUFBcUIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO3VHQXRPVSxtQkFBbUIsMkNBMExtQixRQUFRLGFBQXNDLFdBQVc7MkZBMUwvRixtQkFBbUIsc0hDVmhDLEVBQUE7OzJGRFVhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQThMZSxNQUFNOzJCQUFDLFFBQVE7OzBCQUErQixNQUFNOzJCQUFDLFdBQVc7eUNBeExuRyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGRmQnJlYWtwb2ludHMgfSBmcm9tICcuLi9yZXNwb25zaXZlLXZpc2liaWxpdHknO1xuaW1wb3J0IHsgYWRkVHJ1c3RlZEhUTUwgfSBmcm9tICcuLi90aGVtZS9zYW5pdGl6ZWQtY3NzLWluamVjdG9yJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLWR5bmFtaWMtY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtY3NzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZHluYW1pYy1jc3MuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQ3NzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB6b29tID0gMS4wO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aCA9IDMuMTQxNTkyNjUzNTk7XG5cbiAgcHVibGljIHh4cyA9IDQ1NTtcblxuICBwdWJsaWMgeHMgPSA0OTA7XG5cbiAgcHVibGljIHNtID0gNTYwO1xuXG4gIHB1YmxpYyBtZCA9IDYxMDtcblxuICBwdWJsaWMgbGcgPSA2NjA7XG5cbiAgcHVibGljIHhsID0gNzQwO1xuXG4gIHB1YmxpYyB4eGwgPSA4MzA7XG5cbiAgcHVibGljIGdldCBzdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4jdG9vbGJhckNvbnRhaW5lciAuYWx3YXlzLWluLXNlY29uZGFyeS1tZW51IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuI3NlY29uZGFyeVRvb2xiYXIgLmFsd2F5cy1pbi1zZWNvbmRhcnktbWVudSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVYWFNWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcsXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVTbWFsbFZpZXcsXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVNZWRpdW1WaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlTGFyZ2VWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlWExWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlWFhMVmlldyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICR7dGhpcy54bH1weCkge1xuICAjdG9vbGJhclZpZXdlck1pZGRsZSB7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIGxlZnQ6IGF1dG87XG4gICAgcG9zaXRpb246IGluaGVyaXQ7XG4gICAgdHJhbnNmb3JtOiBub25lO1xuICB9XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICR7dGhpcy54eGx9KSB7XG4gICNzaWRlYmFyQ29udGVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICB9XG5cbiAgaHRtbFtkaXI9J2x0ciddICNvdXRlckNvbnRhaW5lci5zaWRlYmFyT3BlbiAjdmlld2VyQ29udGFpbmVyIHtcbiAgICBsZWZ0OiAwcHggIWltcG9ydGFudDtcbiAgfVxuICBodG1sW2Rpcj0ncnRsJ10gI291dGVyQ29udGFpbmVyLnNpZGViYXJPcGVuICN2aWV3ZXJDb250YWluZXIge1xuICAgIHJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgfVxuXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTGFyZ2VWaWV3LFxuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlbk1lZGl1bVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLmxnfXB4KSB7XG4gIC50b29sYmFyQnV0dG9uU3BhY2VyIHtcbiAgICB3aWR0aDogMTVweDtcbiAgfVxuXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTGFyZ2VWaWV3IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAgI21haW5Db250YWluZXIgLnZpc2libGVMYXJnZVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLm1kfXB4KSB7XG4gIC50b29sYmFyQnV0dG9uU3BhY2VyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTWVkaXVtVmlldyB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAjb3V0ZXJDb250YWluZXIgICNtYWluQ29udGFpbmVyIC52aXNpYmxlTWVkaXVtVmlldyB7XG4gICAgZGlzcGxheTogaW5oZXJpdDtcbiAgfVxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAke3RoaXMuc219cHgpIHtcbiAgI291dGVyQ29udGFpbmVyIC5oaWRkZW5TbWFsbFZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuU21hbGxWaWV3ICoge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyICAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVNtYWxsVmlldyB7XG4gICAgZGlzcGxheTogaW5oZXJpdDtcbiAgfVxuICAudG9vbGJhckJ1dHRvblNwYWNlciB7XG4gICAgd2lkdGg6IDA7XG4gIH1cbiAgaHRtbFtkaXI9J2x0ciddIC5maW5kYmFyIHtcbiAgICBsZWZ0OiAzOHB4O1xuICB9XG4gIGh0bWxbZGlyPSdydGwnXSAuZmluZGJhciB7XG4gICAgcmlnaHQ6IDM4cHg7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnNtfXB4KSB7XG4gICNzY2FsZVNlbGVjdENvbnRhaW5lciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4jb3V0ZXJDb250YWluZXIgLnZpc2libGVYTFZpZXcsXG4jb3V0ZXJDb250YWluZXIgLnZpc2libGVYWExWaWV3LFxuI291dGVyQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4jb3V0ZXJDb250YWluZXIgLmhpZGRlblhMVmlldyxcbiNvdXRlckNvbnRhaW5lciAuaGlkZGVuWFhMVmlldyB7XG4gIGRpc3BsYXk6IHVuc2V0O1xufVxuXG5AbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAke3RoaXMueGx9cHgpIHtcbiAgI291dGVyQ29udGFpbmVyIC5oaWRkZW5YTFZpZXcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyIC52aXNpYmxlWExWaWV3IHtcbiAgICBkaXNwbGF5OiBpbmhlcml0O1xuICB9XG5cbiAgI3Rvb2xiYXJWaWV3ZXJNaWRkbGUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zNiUpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzYlKTtcbiAgICBkaXNwbGF5OiB1bnNldDtcbiAgICBtYXJnaW46IHVuc2V0O1xuICAgIGxlZnQ6IDUwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnh4bH1weCkge1xuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlblhYTFZpZXcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyICAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVhYTFZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLm1kfXB4KSB7XG4gICN0b29sYmFyVmlld2VyTWlkZGxlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMjYlKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTI2JSk7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnhzfXB4KSB7XG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuVGlueVZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuVGlueVZpZXcgKiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAjb3V0ZXJDb250YWluZXIgICNtYWluQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnh4c31weCkge1xuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlblhYU1ZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuWFhTVmlldyAqIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVhYU1ZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLndpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbmplY3RTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnN0IGZ1bGxXaXRoID0gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHBhcnRpYWxWaWV3U2NhbGUgPSBmdWxsV2l0aCAvIHRoaXMud2lkdGg7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBwYXJ0aWFsVmlld1NjYWxlICogKHRoaXMuem9vbSA/IHRoaXMuem9vbSA6IDEpO1xuXG4gICAgdGhpcy54cyA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMueHM7XG4gICAgdGhpcy5zbSA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMuc207XG4gICAgdGhpcy5tZCA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMubWQ7XG4gICAgdGhpcy5sZyA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMubGc7XG4gICAgdGhpcy54bCA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMueGw7XG4gICAgdGhpcy54eGwgPSBzY2FsZUZhY3RvciAqIFBkZkJyZWFrcG9pbnRzLnh4bDtcblxuICAgIGxldCBzdHlsZXMgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZGYtZHluYW1pYy1jc3MnKSBhcyBIVE1MU3R5bGVFbGVtZW50O1xuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICBzdHlsZXMgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1NUWUxFJykgYXMgSFRNTFN0eWxlRWxlbWVudDtcbiAgICAgIHN0eWxlcy5pZCA9ICdwZGYtZHluYW1pYy1jc3MnO1xuICAgICAgYWRkVHJ1c3RlZEhUTUwoc3R5bGVzLCB0aGlzLnN0eWxlKTtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlcyk7XG4gICAgfVxuICAgIGFkZFRydXN0ZWRIVE1MKHN0eWxlcywgdGhpcy5zdHlsZSk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFN0eWxlKCkge1xuICAgIGlmICh0aGlzLndpZHRoID09PSAzLjE0MTU5MjY1MzU5KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmdPbkNoYW5nZXMoKSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BkZi1keW5hbWljLWNzcycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChzdHlsZXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIChzdHlsZXMucGFyZW50RWxlbWVudCBhcyBhbnkpLnJlbW92ZUNoaWxkKHN0eWxlcyk7XG4gICAgfVxuICB9XG59XG4iLCIiXX0=