ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
177 lines (175 loc) • 19.2 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { isPlatformBrowser } from '@angular/common';
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, inject, Input, numberAttribute, Output, PLATFORM_ID, ViewChild } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NzButtonModule } from 'ng-zorro-antd/button';
import { NzIconModule } from 'ng-zorro-antd/icon';
import { NzSpinModule } from 'ng-zorro-antd/spin';
import { drawCanvas, plotQRCodeData } from './qrcode';
import * as i0 from "@angular/core";
import * as i1 from "ng-zorro-antd/i18n";
import * as i2 from "ng-zorro-antd/spin";
import * as i3 from "ng-zorro-antd/button";
import * as i4 from "ng-zorro-antd/core/transition-patch";
import * as i5 from "ng-zorro-antd/icon";
export class NzQRCodeComponent {
constructor(i18n, el, cdr) {
this.i18n = i18n;
this.el = el;
this.cdr = cdr;
this.nzValue = '';
this.nzPadding = 0;
this.nzColor = '#000000';
this.nzBgColor = '#FFFFFF';
this.nzSize = 160;
this.nzIcon = '';
this.nzIconSize = 40;
this.nzBordered = true;
this.nzStatus = 'active';
this.nzLevel = 'M';
this.nzRefresh = new EventEmitter();
// https://github.com/angular/universal-starter/issues/538#issuecomment-365518693
// canvas is not supported by the SSR DOM
this.isBrowser = true;
this.destroy$ = new Subject();
this.platformId = inject(PLATFORM_ID);
this.isBrowser = isPlatformBrowser(this.platformId);
this.cdr.markForCheck();
}
ngOnInit() {
this.el.nativeElement.style.backgroundColor = this.nzBgColor;
this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.locale = this.i18n.getLocaleData('QRCode');
this.cdr.markForCheck();
});
}
ngOnChanges(changes) {
const { nzValue, nzIcon, nzLevel, nzSize, nzIconSize, nzColor, nzPadding, nzBgColor } = changes;
if ((nzValue || nzIcon || nzLevel || nzSize || nzIconSize || nzColor || nzPadding || nzBgColor) && this.canvas) {
this.drawCanvasQRCode();
}
if (nzBgColor) {
this.el.nativeElement.style.backgroundColor = this.nzBgColor;
}
}
ngAfterViewInit() {
this.drawCanvasQRCode();
}
reloadQRCode() {
this.drawCanvasQRCode();
this.nzRefresh.emit('refresh');
}
drawCanvasQRCode() {
if (this.canvas) {
drawCanvas(this.canvas.nativeElement, plotQRCodeData(this.nzValue, this.nzLevel), this.nzSize, 10, this.nzPadding, this.nzColor, this.nzBgColor, this.nzIconSize, this.nzIcon);
}
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzQRCodeComponent, deps: [{ token: i1.NzI18nService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzQRCodeComponent, isStandalone: true, selector: "nz-qrcode", inputs: { nzValue: "nzValue", nzPadding: "nzPadding", nzColor: "nzColor", nzBgColor: "nzBgColor", nzSize: ["nzSize", "nzSize", numberAttribute], nzIcon: "nzIcon", nzIconSize: ["nzIconSize", "nzIconSize", numberAttribute], nzBordered: ["nzBordered", "nzBordered", booleanAttribute], nzStatus: "nzStatus", nzLevel: "nzLevel" }, outputs: { nzRefresh: "nzRefresh" }, host: { properties: { "class.ant-qrcode-border": "nzBordered" }, classAttribute: "ant-qrcode" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }], exportAs: ["nzQRCode"], usesOnChanges: true, ngImport: i0, template: `
(nzStatus !== 'active') {
<div class="ant-qrcode-mask">
(nzStatus) {
('loading') {
<nz-spin />
}
('expired') {
<div>
<p class="ant-qrcode-expired">{{ locale.expired }}</p>
<button nz-button nzType="link" (click)="reloadQRCode()">
<span nz-icon nzType="reload" nzTheme="outline"></span>
<span>{{ locale.refresh }}</span>
</button>
</div>
}
('scanned') {
<div>
<p class="ant-qrcode-expired">{{ locale.scanned }}</p>
</div>
}
}
</div>
}
(isBrowser) {
<canvas #canvas></canvas>
}
`, isInline: true, dependencies: [{ kind: "ngmodule", type: NzSpinModule }, { kind: "component", type: i2.NzSpinComponent, selector: "nz-spin", inputs: ["nzIndicator", "nzSize", "nzTip", "nzDelay", "nzSimple", "nzSpinning"], exportAs: ["nzSpin"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i4.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzQRCodeComponent, decorators: [{
type: Component,
args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'nz-qrcode',
exportAs: 'nzQRCode',
template: `
(nzStatus !== 'active') {
<div class="ant-qrcode-mask">
(nzStatus) {
('loading') {
<nz-spin />
}
('expired') {
<div>
<p class="ant-qrcode-expired">{{ locale.expired }}</p>
<button nz-button nzType="link" (click)="reloadQRCode()">
<span nz-icon nzType="reload" nzTheme="outline"></span>
<span>{{ locale.refresh }}</span>
</button>
</div>
}
('scanned') {
<div>
<p class="ant-qrcode-expired">{{ locale.scanned }}</p>
</div>
}
}
</div>
}
(isBrowser) {
<canvas #canvas></canvas>
}
`,
host: {
class: 'ant-qrcode',
'[class.ant-qrcode-border]': `nzBordered`
},
imports: [NzSpinModule, NzButtonModule, NzIconModule],
standalone: true
}]
}], ctorParameters: () => [{ type: i1.NzI18nService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { canvas: [{
type: ViewChild,
args: ['canvas', { static: false }]
}], nzValue: [{
type: Input
}], nzPadding: [{
type: Input
}], nzColor: [{
type: Input
}], nzBgColor: [{
type: Input
}], nzSize: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzIcon: [{
type: Input
}], nzIconSize: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzBordered: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzStatus: [{
type: Input
}], nzLevel: [{
type: Input
}], nzRefresh: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXJjb2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvcXItY29kZS9xcmNvZGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBSWYsTUFBTSxFQUNOLFdBQVcsRUFFWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBbUIsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7Ozs7O0FBMEN2RSxNQUFNLE9BQU8saUJBQWlCO0lBc0I1QixZQUNVLElBQW1CLEVBQ25CLEVBQWMsRUFDZCxHQUFzQjtRQUZ0QixTQUFJLEdBQUosSUFBSSxDQUFlO1FBQ25CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXZCdkIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixjQUFTLEdBQXNCLENBQUMsQ0FBQztRQUNqQyxZQUFPLEdBQVcsU0FBUyxDQUFDO1FBQzVCLGNBQVMsR0FBVyxTQUFTLENBQUM7UUFDQSxXQUFNLEdBQVcsR0FBRyxDQUFDO1FBQ25ELFdBQU0sR0FBVyxFQUFF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Ozs7Ozs7Ozs7R0E0QlQsMkRBS1MsWUFBWSwyTUFBRSxjQUFjLG9mQUFFLFlBQVk7OzJGQUd6QyxpQkFBaUI7a0JBeEM3QixTQUFTO21CQUFDO29CQUNULGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUUsV0FBVztvQkFDckIsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCVDtvQkFDRCxJQUFJLEVBQUU7d0JBQ0osS0FBSyxFQUFFLFlBQVk7d0JBQ25CLDJCQUEyQixFQUFFLFlBQVk7cUJBQzFDO29CQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDO29CQUNyRCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7MklBRXlDLE1BQU07c0JBQTdDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDN0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ2lDLE1BQU07c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM1QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ2lDLFVBQVU7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUNHLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVhLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlLCBOelFSQ29kZUkxOG5JbnRlcmZhY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcbmltcG9ydCB7IE56U3Bpbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvc3Bpbic7XG5cbmltcG9ydCB7IGRyYXdDYW52YXMsIEVSUk9SX0xFVkVMX01BUCwgcGxvdFFSQ29kZURhdGEgfSBmcm9tICcuL3FyY29kZSc7XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc2VsZWN0b3I6ICduei1xcmNvZGUnLFxuICBleHBvcnRBczogJ256UVJDb2RlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKG56U3RhdHVzICE9PSAnYWN0aXZlJykge1xuICAgICAgPGRpdiBjbGFzcz1cImFudC1xcmNvZGUtbWFza1wiPlxuICAgICAgICBAc3dpdGNoIChuelN0YXR1cykge1xuICAgICAgICAgIEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgICAgIDxuei1zcGluIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBjYXNlICgnZXhwaXJlZCcpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYW50LXFyY29kZS1leHBpcmVkXCI+e3sgbG9jYWxlLmV4cGlyZWQgfX08L3A+XG4gICAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cImxpbmtcIiAoY2xpY2spPVwicmVsb2FkUVJDb2RlKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInJlbG9hZFwiIG56VGhlbWU9XCJvdXRsaW5lXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxvY2FsZS5yZWZyZXNoIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAY2FzZSAoJ3NjYW5uZWQnKSB7XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImFudC1xcmNvZGUtZXhwaXJlZFwiPnt7IGxvY2FsZS5zY2FubmVkIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGlzQnJvd3Nlcikge1xuICAgICAgPGNhbnZhcyAjY2FudmFzPjwvY2FudmFzPlxuICAgIH1cbiAgYCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnYW50LXFyY29kZScsXG4gICAgJ1tjbGFzcy5hbnQtcXJjb2RlLWJvcmRlcl0nOiBgbnpCb3JkZXJlZGBcbiAgfSxcbiAgaW1wb3J0czogW056U3Bpbk1vZHVsZSwgTnpCdXR0b25Nb2R1bGUsIE56SWNvbk1vZHVsZV0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpRUkNvZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnY2FudmFzJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNhbnZhcyE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBASW5wdXQoKSBuelZhbHVlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpQYWRkaW5nOiBudW1iZXIgfCBudW1iZXJbXSA9IDA7XG4gIEBJbnB1dCgpIG56Q29sb3I6IHN0cmluZyA9ICcjMDAwMDAwJztcbiAgQElucHV0KCkgbnpCZ0NvbG9yOiBzdHJpbmcgPSAnI0ZGRkZGRic7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIG56U2l6ZTogbnVtYmVyID0gMTYwO1xuICBASW5wdXQoKSBuekljb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBuekljb25TaXplOiBudW1iZXIgPSA0MDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56Qm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBuelN0YXR1czogJ2FjdGl2ZScgfCAnZXhwaXJlZCcgfCAnbG9hZGluZycgfCAnc2Nhbm5lZCcgPSAnYWN0aXZlJztcbiAgQElucHV0KCkgbnpMZXZlbDoga2V5b2YgdHlwZW9mIEVSUk9SX0xFVkVMX01BUCA9ICdNJztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpSZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgbG9jYWxlITogTnpRUkNvZGVJMThuSW50ZXJmYWNlO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci91bml2ZXJzYWwtc3RhcnRlci9pc3N1ZXMvNTM4I2lzc3VlY29tbWVudC0zNjU1MTg2OTNcbiAgLy8gY2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFNTUiBET01cbiAgaXNCcm93c2VyID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm56QmdDb2xvcjtcbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnUVJDb2RlJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56VmFsdWUsIG56SWNvbiwgbnpMZXZlbCwgbnpTaXplLCBuekljb25TaXplLCBuekNvbG9yLCBuelBhZGRpbmcsIG56QmdDb2xvciB9ID0gY2hhbmdlcztcbiAgICBpZiAoKG56VmFsdWUgfHwgbnpJY29uIHx8IG56TGV2ZWwgfHwgbnpTaXplIHx8IG56SWNvblNpemUgfHwgbnpDb2xvciB8fCBuelBhZGRpbmcgfHwgbnpCZ0NvbG9yKSAmJiB0aGlzLmNhbnZhcykge1xuICAgICAgdGhpcy5kcmF3Q2FudmFzUVJDb2RlKCk7XG4gICAgfVxuXG4gICAgaWYgKG56QmdDb2xvcikge1xuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubnpCZ0NvbG9yO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdDYW52YXNRUkNvZGUoKTtcbiAgfVxuXG4gIHJlbG9hZFFSQ29kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdDYW52YXNRUkNvZGUoKTtcbiAgICB0aGlzLm56UmVmcmVzaC5lbWl0KCdyZWZyZXNoJyk7XG4gIH1cblxuICBkcmF3Q2FudmFzUVJDb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgZHJhd0NhbnZhcyhcbiAgICAgICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudCxcbiAgICAgICAgcGxvdFFSQ29kZURhdGEodGhpcy5uelZhbHVlLCB0aGlzLm56TGV2ZWwpLFxuICAgICAgICB0aGlzLm56U2l6ZSxcbiAgICAgICAgMTAsXG4gICAgICAgIHRoaXMubnpQYWRkaW5nLFxuICAgICAgICB0aGlzLm56Q29sb3IsXG4gICAgICAgIHRoaXMubnpCZ0NvbG9yLFxuICAgICAgICB0aGlzLm56SWNvblNpemUsXG4gICAgICAgIHRoaXMubnpJY29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19