UNPKG

@herdwatch/ng-recaptcha

Version:

Angular component for Google reCAPTCHA

171 lines 20.4 kB
import { Component, EventEmitter, HostBinding, Inject, Input, Optional, Output, } from "@angular/core"; import { RECAPTCHA_SETTINGS } from "./tokens"; import * as i0 from "@angular/core"; import * as i1 from "./recaptcha-loader.service"; let nextId = 0; export class RecaptchaComponent { constructor(elementRef, loader, zone, settings) { this.elementRef = elementRef; this.loader = loader; this.zone = zone; this.id = `ngrecaptcha-${nextId++}`; this.errorMode = "default"; this.resolved = new EventEmitter(); /** * @deprecated `(error) output will be removed in the next major version. Use (errored) instead */ // eslint-disable-next-line @angular-eslint/no-output-native this.error = new EventEmitter(); this.errored = new EventEmitter(); if (settings) { this.siteKey = settings.siteKey; this.theme = settings.theme; this.type = settings.type; this.size = settings.size; this.badge = settings.badge; } } ngAfterViewInit() { this.subscription = this.loader.ready.subscribe((grecaptcha) => { if (grecaptcha != null && grecaptcha.render instanceof Function) { this.grecaptcha = grecaptcha; this.renderRecaptcha(); } }); } ngOnDestroy() { // reset the captcha to ensure it does not leave anything behind // after the component is no longer needed this.grecaptchaReset(); if (this.subscription) { this.subscription.unsubscribe(); } } /** * Executes the invisible recaptcha. * Does nothing if component's size is not set to "invisible". */ execute() { if (this.size !== "invisible") { return; } if (this.widget != null) { void this.grecaptcha.execute(this.widget); } else { // delay execution of recaptcha until it actually renders this.executeRequested = true; } } reset() { if (this.widget != null) { if (this.grecaptcha.getResponse(this.widget)) { // Only emit an event in case if something would actually change. // That way we do not trigger "touching" of the control if someone does a "reset" // on a non-resolved captcha. this.resolved.emit(null); } this.grecaptchaReset(); } } /** * ⚠️ Warning! Use this property at your own risk! * * While this member is `public`, it is not a part of the component's public API. * The semantic versioning guarantees _will not be honored_! Thus, you might find that this property behavior changes in incompatible ways in minor or even patch releases. * You are **strongly advised** against using this property. * Instead, use more idiomatic ways to get reCAPTCHA value, such as `resolved` EventEmitter, or form-bound methods (ngModel, formControl, and the likes).å */ get __unsafe_widgetValue() { return this.widget != null ? this.grecaptcha.getResponse(this.widget) : null; } /** @internal */ expired() { this.resolved.emit(null); } /** @internal */ onError(args) { // eslint-disable-next-line deprecation/deprecation this.error.emit(args); this.errored.emit(args); } /** @internal */ captchaResponseCallback(response) { this.resolved.emit(response); } /** @internal */ grecaptchaReset() { if (this.widget != null) { this.zone.runOutsideAngular(() => this.grecaptcha.reset(this.widget)); } } /** @internal */ renderRecaptcha() { // This `any` can be removed after @types/grecaptcha get updated const renderOptions = { badge: this.badge, callback: (response) => { this.zone.run(() => this.captchaResponseCallback(response)); }, "expired-callback": () => { this.zone.run(() => this.expired()); }, sitekey: this.siteKey, size: this.size, tabindex: this.tabIndex, theme: this.theme, type: this.type, }; if (this.errorMode === "handled") { renderOptions["error-callback"] = (...args) => { this.zone.run(() => this.onError(args)); }; } this.widget = this.grecaptcha.render(this.elementRef.nativeElement, renderOptions); if (this.executeRequested === true) { this.executeRequested = false; this.execute(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RecaptchaComponent, deps: [{ token: i0.ElementRef }, { token: i1.RecaptchaLoaderService }, { token: i0.NgZone }, { token: RECAPTCHA_SETTINGS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RecaptchaComponent, selector: "re-captcha", inputs: { id: "id", siteKey: "siteKey", theme: "theme", type: "type", size: "size", tabIndex: "tabIndex", badge: "badge", errorMode: "errorMode" }, outputs: { resolved: "resolved", error: "error", errored: "errored" }, host: { properties: { "attr.id": "this.id" } }, exportAs: ["reCaptcha"], ngImport: i0, template: ``, isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RecaptchaComponent, decorators: [{ type: Component, args: [{ exportAs: "reCaptcha", selector: "re-captcha", template: ``, }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.RecaptchaLoaderService }, { type: i0.NgZone }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [RECAPTCHA_SETTINGS] }] }], propDecorators: { id: [{ type: Input }, { type: HostBinding, args: ["attr.id"] }], siteKey: [{ type: Input }], theme: [{ type: Input }], type: [{ type: Input }], size: [{ type: Input }], tabIndex: [{ type: Input }], badge: [{ type: Input }], errorMode: [{ type: Input }], resolved: [{ type: Output }], error: [{ type: Output }], errored: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXJlY2FwdGNoYS9zcmMvbGliL3JlY2FwdGNoYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUt2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUU5QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFXZixNQUFNLE9BQU8sa0JBQWtCO0lBOEI3QixZQUNVLFVBQW1DLEVBQ25DLE1BQThCLEVBQzlCLElBQVksRUFDb0IsUUFBNEI7UUFINUQsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQTlCZixPQUFFLEdBQUcsZUFBZSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBUXRCLGNBQVMsR0FBMEIsU0FBUyxDQUFDO1FBRTVDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUM5RDs7V0FFRztRQUNILDREQUE0RDtRQUMzQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDckQsWUFBTyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBaUJ0RSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFB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Z0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDOzhHQS9KVSxrQkFBa0Isd0dBa0NQLGtCQUFrQjtrR0FsQzdCLGtCQUFrQixzVkFGbkIsRUFBRTs7MkZBRUQsa0JBQWtCO2tCQUw5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxXQUFXO29CQUNyQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7OzBCQW1DSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjt5Q0EvQmpDLEVBQUU7c0JBRlIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxTQUFTO2dCQUdOLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBRVcsUUFBUTtzQkFBeEIsTUFBTTtnQkFLVSxLQUFLO3NCQUFyQixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgUmVjYXB0Y2hhTG9hZGVyU2VydmljZSB9IGZyb20gXCIuL3JlY2FwdGNoYS1sb2FkZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgUmVjYXB0Y2hhU2V0dGluZ3MgfSBmcm9tIFwiLi9yZWNhcHRjaGEtc2V0dGluZ3NcIjtcbmltcG9ydCB7IFJFQ0FQVENIQV9TRVRUSU5HUyB9IGZyb20gXCIuL3Rva2Vuc1wiO1xuXG5sZXQgbmV4dElkID0gMDtcblxuZXhwb3J0IHR5cGUgTmV2ZXJVbmRlZmluZWQ8VD4gPSBUIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBUO1xuXG5leHBvcnQgdHlwZSBSZWNhcHRjaGFFcnJvclBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzPE5ldmVyVW5kZWZpbmVkPFJlQ2FwdGNoYVYyLlBhcmFtZXRlcnNbXCJlcnJvci1jYWxsYmFja1wiXT4+O1xuXG5AQ29tcG9uZW50KHtcbiAgZXhwb3J0QXM6IFwicmVDYXB0Y2hhXCIsXG4gIHNlbGVjdG9yOiBcInJlLWNhcHRjaGFcIixcbiAgdGVtcGxhdGU6IGBgLFxufSlcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoXCJhdHRyLmlkXCIpXG4gIHB1YmxpYyBpZCA9IGBuZ3JlY2FwdGNoYS0ke25leHRJZCsrfWA7XG5cbiAgQElucHV0KCkgcHVibGljIHNpdGVLZXk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyB0aGVtZT86IFJlQ2FwdGNoYVYyLlRoZW1lO1xuICBASW5wdXQoKSBwdWJsaWMgdHlwZT86IFJlQ2FwdGNoYVYyLlR5cGU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaXplPzogUmVDYXB0Y2hhVjIuU2l6ZTtcbiAgQElucHV0KCkgcHVibGljIHRhYkluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBwdWJsaWMgYmFkZ2U/OiBSZUNhcHRjaGFWMi5CYWRnZTtcbiAgQElucHV0KCkgcHVibGljIGVycm9yTW9kZTogXCJoYW5kbGVkXCIgfCBcImRlZmF1bHRcIiA9IFwiZGVmYXVsdFwiO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVzb2x2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBgKGVycm9yKSBvdXRwdXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uIFVzZSAoZXJyb3JlZCkgaW5zdGVhZFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBwdWJsaWMgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY2FwdGNoYUVycm9yUGFyYW1ldGVycz4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBlcnJvcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNhcHRjaGFFcnJvclBhcmFtZXRlcnM+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgd2lkZ2V0OiBudW1iZXI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBncmVjYXB0Y2hhOiBSZUNhcHRjaGFWMi5SZUNhcHRjaGE7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBleGVjdXRlUmVxdWVzdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBsb2FkZXI6IFJlY2FwdGNoYUxvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRUNBUFRDSEFfU0VUVElOR1MpIHNldHRpbmdzPzogUmVjYXB0Y2hhU2V0dGluZ3MsXG4gICkge1xuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgdGhpcy5zaXRlS2V5ID0gc2V0dGluZ3Muc2l0ZUtleTtcbiAgICAgIHRoaXMudGhlbWUgPSBzZXR0aW5ncy50aGVtZTtcbiAgICAgIHRoaXMudHlwZSA9IHNldHRpbmdzLnR5cGU7XG4gICAgICB0aGlzLnNpemUgPSBzZXR0aW5ncy5zaXplO1xuICAgICAgdGhpcy5iYWRnZSA9IHNldHRpbmdzLmJhZGdlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmxvYWRlci5yZWFkeS5zdWJzY3JpYmUoKGdyZWNhcHRjaGE6IFJlQ2FwdGNoYVYyLlJlQ2FwdGNoYSkgPT4ge1xuICAgICAgaWYgKGdyZWNhcHRjaGEgIT0gbnVsbCAmJiBncmVjYXB0Y2hhLnJlbmRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuZ3JlY2FwdGNoYSA9IGdyZWNhcHRjaGE7XG4gICAgICAgIHRoaXMucmVuZGVyUmVjYXB0Y2hhKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gcmVzZXQgdGhlIGNhcHRjaGEgdG8gZW5zdXJlIGl0IGRvZXMgbm90IGxlYXZlIGFueXRoaW5nIGJlaGluZFxuICAgIC8vIGFmdGVyIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuICAgIHRoaXMuZ3JlY2FwdGNoYVJlc2V0KCk7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgaW52aXNpYmxlIHJlY2FwdGNoYS5cbiAgICogRG9lcyBub3RoaW5nIGlmIGNvbXBvbmVudCdzIHNpemUgaXMgbm90IHNldCB0byBcImludmlzaWJsZVwiLlxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2l6ZSAhPT0gXCJpbnZpc2libGVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldCAhPSBudWxsKSB7XG4gICAgICB2b2lkIHRoaXMuZ3JlY2FwdGNoYS5leGVjdXRlKHRoaXMud2lkZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVsYXkgZXhlY3V0aW9uIG9mIHJlY2FwdGNoYSB1bnRpbCBpdCBhY3R1YWxseSByZW5kZXJzXG4gICAgICB0aGlzLmV4ZWN1dGVSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aWRnZXQgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZ3JlY2FwdGNoYS5nZXRSZXNwb25zZSh0aGlzLndpZGdldCkpIHtcbiAgICAgICAgLy8gT25seSBlbWl0IGFuIGV2ZW50IGluIGNhc2UgaWYgc29tZXRoaW5nIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgZG8gbm90IHRyaWdnZXIgXCJ0b3VjaGluZ1wiIG9mIHRoZSBjb250cm9sIGlmIHNvbWVvbmUgZG9lcyBhIFwicmVzZXRcIlxuICAgICAgICAvLyBvbiBhIG5vbi1yZXNvbHZlZCBjYXB0Y2hhLlxuICAgICAgICB0aGlzLnJlc29sdmVkLmVtaXQobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3JlY2FwdGNoYVJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOKaoO+4jyBXYXJuaW5nISBVc2UgdGhpcyBwcm9wZXJ0eSBhdCB5b3VyIG93biByaXNrIVxuICAgKlxuICAgKiBXaGlsZSB0aGlzIG1lbWJlciBpcyBgcHVibGljYCwgaXQgaXMgbm90IGEgcGFydCBvZiB0aGUgY29tcG9uZW50J3MgcHVibGljIEFQSS5cbiAgICogVGhlIHNlbWFudGljIHZlcnNpb25pbmcgZ3VhcmFudGVlcyBfd2lsbCBub3QgYmUgaG9ub3JlZF8hIFRodXMsIHlvdSBtaWdodCBmaW5kIHRoYXQgdGhpcyBwcm9wZXJ0eSBiZWhhdmlvciBjaGFuZ2VzIGluIGluY29tcGF0aWJsZSB3YXlzIGluIG1pbm9yIG9yIGV2ZW4gcGF0Y2ggcmVsZWFzZXMuXG4gICAqIFlvdSBhcmUgKipzdHJvbmdseSBhZHZpc2VkKiogYWdhaW5zdCB1c2luZyB0aGlzIHByb3BlcnR5LlxuICAgKiBJbnN0ZWFkLCB1c2UgbW9yZSBpZGlvbWF0aWMgd2F5cyB0byBnZXQgcmVDQVBUQ0hBIHZhbHVlLCBzdWNoIGFzIGByZXNvbHZlZGAgRXZlbnRFbWl0dGVyLCBvciBmb3JtLWJvdW5kIG1ldGhvZHMgKG5nTW9kZWwsIGZvcm1Db250cm9sLCBhbmQgdGhlIGxpa2VzKS7DpVxuICAgKi9cbiAgcHVibGljIGdldCBfX3Vuc2FmZV93aWRnZXRWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXQgIT0gbnVsbCA/IHRoaXMuZ3JlY2FwdGNoYS5nZXRSZXNwb25zZSh0aGlzLndpZGdldCkgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGV4cGlyZWQoKSB7XG4gICAgdGhpcy5yZXNvbHZlZC5lbWl0KG51bGwpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIG9uRXJyb3IoYXJnczogUmVjYXB0Y2hhRXJyb3JQYXJhbWV0ZXJzKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgdGhpcy5lcnJvci5lbWl0KGFyZ3MpO1xuICAgIHRoaXMuZXJyb3JlZC5lbWl0KGFyZ3MpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGNhcHRjaGFSZXNwb25zZUNhbGxiYWNrKHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc29sdmVkLmVtaXQocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGdyZWNhcHRjaGFSZXNldCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXQgIT0gbnVsbCkge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZ3JlY2FwdGNoYS5yZXNldCh0aGlzLndpZGdldCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZWNhcHRjaGEoKSB7XG4gICAgLy8gVGhpcyBgYW55YCBjYW4gYmUgcmVtb3ZlZCBhZnRlciBAdHlwZXMvZ3JlY2FwdGNoYSBnZXQgdXBkYXRlZFxuICAgIGNvbnN0IHJlbmRlck9wdGlvbnM6IFJlQ2FwdGNoYVYyLlBhcmFtZXRlcnMgPSB7XG4gICAgICBiYWRnZTogdGhpcy5iYWRnZSxcbiAgICAgIGNhbGxiYWNrOiAocmVzcG9uc2U6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuY2FwdGNoYVJlc3BvbnNlQ2FsbGJhY2socmVzcG9uc2UpKTtcbiAgICAgIH0sXG4gICAgICBcImV4cGlyZWQtY2FsbGJhY2tcIjogKCkgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZXhwaXJlZCgpKTtcbiAgICAgIH0sXG4gICAgICBzaXRla2V5OiB0aGlzLnNpdGVLZXksXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICB0YWJpbmRleDogdGhpcy50YWJJbmRleCxcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5lcnJvck1vZGUgPT09IFwiaGFuZGxlZFwiKSB7XG4gICAgICByZW5kZXJPcHRpb25zW1wiZXJyb3ItY2FsbGJhY2tcIl0gPSAoLi4uYXJnczogUmVjYXB0Y2hhRXJyb3JQYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5vbkVycm9yKGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy53aWRnZXQgPSB0aGlzLmdyZWNhcHRjaGEucmVuZGVyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCByZW5kZXJPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4ZWN1dGVSZXF1ZXN0ZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZXhlY3V0ZVJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5leGVjdXRlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=