@niur/ng-gpt
Version:
A Angular implementation of the google GPT API.
211 lines • 28.8 kB
JavaScript
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { buffer, switchMap } from 'rxjs/operators';
import { Subject, timer } from 'rxjs';
import { RefreshSlot, DisplaySlot } from './ng-gpt.actions';
import { DELAY_TIME, GPT_URL } from './constants';
import { ImpressionViewableEvent, RewardedSlotClosedEvent, RewardedSlotGrantedEvent, SlotOnloadEvent, SlotRenderEndedEvent, SlotRequestedEvent, SlotResponseReceived, SlotVisibilityChangedEvent, } from './ng-gpt.events';
import { GPT_OPTIONS } from './ng-gpt-options.service';
import * as i0 from "@angular/core";
import * as i1 from "./utils";
import * as i2 from "./ng-gpt-options.service";
export class NgGptService {
constructor(options, platformId, scriptInjector) {
this.options = options;
this.platformId = platformId;
this.scriptInjector = scriptInjector;
this.$singleRequest = new Subject();
if (isPlatformBrowser(this.platformId)) {
this.init();
}
}
init() {
if (!window.googletag) {
const loadScript = () => {
this.scriptInjector.injectScript(GPT_URL);
};
loadScript();
window.googletag = window.googletag || { cmd: [] };
}
this.$singleRequest
.pipe(buffer(this.$singleRequest.pipe(switchMap(() => timer(DELAY_TIME * 2)))))
.subscribe((acts) => {
const refreshSlots = [];
acts.forEach((act) => {
if (act instanceof DisplaySlot) {
googletag.display(act.slot);
}
else {
refreshSlots.push(act.slot);
}
});
if (refreshSlots.length > 0) {
googletag.pubads().refresh(refreshSlots);
}
});
googletag.cmd.push(() => {
const pubads = googletag.pubads();
const { address, centering, collapseEmptyDivs, enableLazyLoad, enableSingleRequest, ppid, targeting, forceSafeFrame, safeFrameConfig, privacySettingsConfig, disableInitialLoad, } = this.options;
if (disableInitialLoad)
pubads.disableInitialLoad();
// Collapse Empty Divs
if (collapseEmptyDivs)
pubads.collapseEmptyDivs();
// Centering
if (centering)
pubads.setCentering(centering);
// Location
if (address)
pubads.setLocation(address);
// Publisher Provided Id
if (ppid)
pubads.setPublisherProvidedId(ppid);
// Force Safe Frame
if (forceSafeFrame)
pubads.setForceSafeFrame(forceSafeFrame);
// Targeting
if (targeting && Object.keys(targeting).length) {
for (const key in targeting) {
if (targeting.hasOwnProperty(key)) {
pubads.setTargeting(key, targeting[key]);
}
}
}
// Safe Frame Config
if (safeFrameConfig && Object.keys(safeFrameConfig).length) {
pubads.setSafeFrameConfig(safeFrameConfig);
}
// Privacy Settings Config
if (privacySettingsConfig && Object.keys(privacySettingsConfig).length) {
googletag.pubads().setPrivacySettings(privacySettingsConfig);
}
// Enable Lazy Load
if (enableLazyLoad && Object.keys(enableLazyLoad).length) {
pubads.enableLazyLoad(enableLazyLoad);
}
if (enableSingleRequest) {
pubads.enableSingleRequest();
}
});
}
define(ad, slot) {
const id = ad.id || '';
const pubads = googletag.pubads();
if (!slot) {
const exists = this.getSlot(id);
if (exists) {
this.destroy(exists);
}
if (ad.size) {
slot = googletag.defineSlot(ad.adUnitPath, ad.size, id);
}
else {
slot = googletag.defineOutOfPageSlot(ad.adUnitPath, id);
}
}
if (ad.sizeMapping) {
slot.defineSizeMapping(ad.sizeMapping);
}
slot.clearCategoryExclusions();
if (ad.categoryExclusion) {
if (ad.categoryExclusion instanceof Array) {
const s = slot;
ad.categoryExclusion.forEach((cat) => s.setCategoryExclusion(cat));
}
else {
slot.setCategoryExclusion(ad.categoryExclusion);
}
}
slot.set('adsense_background_color', '#000000');
if (typeof ad.forceSafeFrame === 'boolean') {
slot.setForceSafeFrame(ad.forceSafeFrame);
}
if (ad.safeFrameConfig) {
slot.setSafeFrameConfig(ad.safeFrameConfig);
}
slot.clearTargeting();
if (ad.targeting) {
slot.updateTargetingFromMap(ad.targeting);
}
if (ad.collapseEmptyDiv instanceof Array) {
slot.setCollapseEmptyDiv(ad.collapseEmptyDiv[0], ad.collapseEmptyDiv[1]);
}
else if (typeof ad.collapseEmptyDiv === 'boolean') {
slot.setCollapseEmptyDiv(ad.collapseEmptyDiv);
}
if (ad.clickUrl) {
slot.setClickUrl(ad.clickUrl);
}
// Events
googletag.cmd.push(() => {
pubads.addEventListener('impressionViewable', (event) => {
ad.impressionViewable.emit(new ImpressionViewableEvent(event));
});
pubads.addEventListener('rewardedSlotClosed', (event) => {
ad.rewardedSlotClosed.emit(new RewardedSlotClosedEvent(event));
});
pubads.addEventListener('rewardedSlotGranted', (event) => {
ad.rewardedSlotGranted.emit(new RewardedSlotGrantedEvent(event));
});
pubads.addEventListener('rewardedSlotReady', (event) => {
ad.rewardedSlotReady.emit(new RewardedSlotGrantedEvent(event));
});
pubads.addEventListener('slotOnload', (event) => {
ad.slotOnload.emit(new SlotOnloadEvent(event));
});
pubads.addEventListener('slotRenderEnded', (event) => {
ad.slotRenderEnded.emit(new SlotRenderEndedEvent(event));
});
pubads.addEventListener('slotRequested', (event) => {
ad.slotRequested.emit(new SlotRequestedEvent(event));
});
pubads.addEventListener('slotResponseReceived', (event) => {
ad.slotResponseReceived.emit(new SlotResponseReceived(event));
});
pubads.addEventListener('slotVisibilityChanged', (event) => {
ad.slotVisibilityChanged.emit(new SlotVisibilityChangedEvent(event));
});
});
slot.addService(googletag.pubads());
googletag.enableServices();
return slot;
}
display(slot) {
this.$singleRequest.next(new DisplaySlot(slot));
}
refresh(slot) {
this.$singleRequest.next(new RefreshSlot(slot));
}
destroy(slot) {
googletag.destroySlots([slot]);
}
getSlot(id) {
return this.getSlots().find((slot) => slot.getSlotElementId() === id);
}
getSlots(ids) {
const slots = googletag.pubads().getSlots();
return slots.filter((slot) => !ids || ids.includes(slot.getSlotElementId()));
}
defineTask(task) {
if (isPlatformBrowser(this.platformId)) {
googletag.cmd.push(task);
return true;
}
return false;
}
}
NgGptService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: NgGptService, deps: [{ token: GPT_OPTIONS }, { token: PLATFORM_ID }, { token: i1.ScriptInjectorUtil }], target: i0.ɵɵFactoryTarget.Injectable });
NgGptService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: NgGptService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: NgGptService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i2.NgGptServiceOptions, decorators: [{
type: Inject,
args: [GPT_OPTIONS]
}] }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i1.ScriptInjectorUtil }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZ3B0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1ncHQvc3JjL2xpYi9uZy1ncHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQVcsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBdUIsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQU01RSxNQUFNLE9BQU8sWUFBWTtJQUd2QixZQUMrQixPQUE0QixFQUM1QixVQUFrQixFQUN2QyxjQUFrQztRQUZiLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsbUJBQWMsR0FBZCxjQUFjLENBQW9CO1FBTHBDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQU85QyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7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TUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBS0ksTUFBTTsyQkFBQyxXQUFXOzhCQUNzQixNQUFNOzBCQUE5QyxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBidWZmZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcXVlc3QsIFJlZnJlc2hTbG90LCBEaXNwbGF5U2xvdCB9IGZyb20gJy4vbmctZ3B0LmFjdGlvbnMnO1xuaW1wb3J0IHsgREVMQVlfVElNRSwgR1BUX1VSTCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgSW1wcmVzc2lvblZpZXdhYmxlRXZlbnQsXG4gIFJld2FyZGVkU2xvdENsb3NlZEV2ZW50LFxuICBSZXdhcmRlZFNsb3RHcmFudGVkRXZlbnQsXG4gIFNsb3RPbmxvYWRFdmVudCxcbiAgU2xvdFJlbmRlckVuZGVkRXZlbnQsXG4gIFNsb3RSZXF1ZXN0ZWRFdmVudCxcbiAgU2xvdFJlc3BvbnNlUmVjZWl2ZWQsXG4gIFNsb3RWaXNpYmlsaXR5Q2hhbmdlZEV2ZW50LFxufSBmcm9tICcuL25nLWdwdC5ldmVudHMnO1xuaW1wb3J0IHsgR1BUX09QVElPTlMsIE5nR3B0U2VydmljZU9wdGlvbnMgfSBmcm9tICcuL25nLWdwdC1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NyaXB0SW5qZWN0b3JVdGlsIH0gZnJvbSAnLi91dGlscyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ0dwdFNlcnZpY2Uge1xuICBwcml2YXRlICRzaW5nbGVSZXF1ZXN0ID0gbmV3IFN1YmplY3Q8UmVxdWVzdD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEdQVF9PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IE5nR3B0U2VydmljZU9wdGlvbnMsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG4gICAgcHJpdmF0ZSBzY3JpcHRJbmplY3RvcjogU2NyaXB0SW5qZWN0b3JVdGlsXG4gICkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gIH1cblxuICBpbml0KCk6IHZvaWQge1xuICAgIGlmICghd2luZG93Lmdvb2dsZXRhZykge1xuICAgICAgY29uc3QgbG9hZFNjcmlwdCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JpcHRJbmplY3Rvci5pbmplY3RTY3JpcHQoR1BUX1VSTCk7XG4gICAgICB9O1xuICAgICAgbG9hZFNjcmlwdCgpO1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLmdvb2dsZXRhZyA9IHdpbmRvdy5nb29nbGV0YWcgfHwgeyBjbWQ6IFtdIH07XG4gICAgfVxuXG4gICAgdGhpcy4kc2luZ2xlUmVxdWVzdFxuICAgICAgLnBpcGUoXG4gICAgICAgIGJ1ZmZlcih0aGlzLiRzaW5nbGVSZXF1ZXN0LnBpcGUoc3dpdGNoTWFwKCgpID0+IHRpbWVyKERFTEFZX1RJTUUgKiAyKSkpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoYWN0cykgPT4ge1xuICAgICAgICBjb25zdCByZWZyZXNoU2xvdHM6IGdvb2dsZXRhZy5TbG90W10gPSBbXTtcbiAgICAgICAgYWN0cy5mb3JFYWNoKChhY3QpID0+IHtcbiAgICAgICAgICBpZiAoYWN0IGluc3RhbmNlb2YgRGlzcGxheVNsb3QpIHtcbiAgICAgICAgICAgIGdvb2dsZXRhZy5kaXNwbGF5KGFjdC5zbG90KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVmcmVzaFNsb3RzLnB1c2goYWN0LnNsb3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWZyZXNoU2xvdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGdvb2dsZXRhZy5wdWJhZHMoKS5yZWZyZXNoKHJlZnJlc2hTbG90cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgZ29vZ2xldGFnLmNtZC5wdXNoKCgpID0+IHtcbiAgICAgIGNvbnN0IHB1YmFkcyA9IGdvb2dsZXRhZy5wdWJhZHMoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgY2VudGVyaW5nLFxuICAgICAgICBjb2xsYXBzZUVtcHR5RGl2cyxcbiAgICAgICAgZW5hYmxlTGF6eUxvYWQsXG4gICAgICAgIGVuYWJsZVNpbmdsZVJlcXVlc3QsXG4gICAgICAgIHBwaWQsXG4gICAgICAgIHRhcmdldGluZyxcbiAgICAgICAgZm9yY2VTYWZlRnJhbWUsXG4gICAgICAgIHNhZmVGcmFtZUNvbmZpZyxcbiAgICAgICAgcHJpdmFjeVNldHRpbmdzQ29uZmlnLFxuICAgICAgICBkaXNhYmxlSW5pdGlhbExvYWQsXG4gICAgICB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAoZGlzYWJsZUluaXRpYWxMb2FkKSBwdWJhZHMuZGlzYWJsZUluaXRpYWxMb2FkKCk7XG5cbiAgICAgIC8vIENvbGxhcHNlIEVtcHR5IERpdnNcbiAgICAgIGlmIChjb2xsYXBzZUVtcHR5RGl2cykgcHViYWRzLmNvbGxhcHNlRW1wdHlEaXZzKCk7XG4gICAgICAvLyBDZW50ZXJpbmdcbiAgICAgIGlmIChjZW50ZXJpbmcpIHB1YmFkcy5zZXRDZW50ZXJpbmcoY2VudGVyaW5nKTtcbiAgICAgIC8vIExvY2F0aW9uXG4gICAgICBpZiAoYWRkcmVzcykgcHViYWRzLnNldExvY2F0aW9uKGFkZHJlc3MpO1xuICAgICAgLy8gUHVibGlzaGVyIFByb3ZpZGVkIElkXG4gICAgICBpZiAocHBpZCkgcHViYWRzLnNldFB1Ymxpc2hlclByb3ZpZGVkSWQocHBpZCk7XG4gICAgICAvLyBGb3JjZSBTYWZlIEZyYW1lXG4gICAgICBpZiAoZm9yY2VTYWZlRnJhbWUpIHB1YmFkcy5zZXRGb3JjZVNhZmVGcmFtZShmb3JjZVNhZmVGcmFtZSk7XG4gICAgICAvLyBUYXJnZXRpbmdcbiAgICAgIGlmICh0YXJnZXRpbmcgJiYgT2JqZWN0LmtleXModGFyZ2V0aW5nKS5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0aW5nKSB7XG4gICAgICAgICAgaWYgKHRhcmdldGluZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBwdWJhZHMuc2V0VGFyZ2V0aW5nKGtleSwgdGFyZ2V0aW5nW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2FmZSBGcmFtZSBDb25maWdcbiAgICAgIGlmIChzYWZlRnJhbWVDb25maWcgJiYgT2JqZWN0LmtleXMoc2FmZUZyYW1lQ29uZmlnKS5sZW5ndGgpIHtcbiAgICAgICAgcHViYWRzLnNldFNhZmVGcmFtZUNvbmZpZyhzYWZlRnJhbWVDb25maWcpO1xuICAgICAgfVxuICAgICAgLy8gUHJpdmFjeSBTZXR0aW5ncyBDb25maWdcbiAgICAgIGlmIChwcml2YWN5U2V0dGluZ3NDb25maWcgJiYgT2JqZWN0LmtleXMocHJpdmFjeVNldHRpbmdzQ29uZmlnKS5sZW5ndGgpIHtcbiAgICAgICAgZ29vZ2xldGFnLnB1YmFkcygpLnNldFByaXZhY3lTZXR0aW5ncyhwcml2YWN5U2V0dGluZ3NDb25maWcpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmFibGUgTGF6eSBMb2FkXG4gICAgICBpZiAoZW5hYmxlTGF6eUxvYWQgJiYgT2JqZWN0LmtleXMoZW5hYmxlTGF6eUxvYWQpLmxlbmd0aCkge1xuICAgICAgICBwdWJhZHMuZW5hYmxlTGF6eUxvYWQoZW5hYmxlTGF6eUxvYWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2luZ2xlUmVxdWVzdCkge1xuICAgICAgICBwdWJhZHMuZW5hYmxlU2luZ2xlUmVxdWVzdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZGVmaW5lKGFkOiBhbnksIHNsb3Q/OiBnb29nbGV0YWcuU2xvdCk6IGdvb2dsZXRhZy5TbG90IHtcbiAgICBjb25zdCBpZCA9IGFkLmlkIHx8ICcnO1xuICAgIGNvbnN0IHB1YmFkcyA9IGdvb2dsZXRhZy5wdWJhZHMoKTtcblxuICAgIGlmICghc2xvdCkge1xuICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5nZXRTbG90KGlkKTtcbiAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGV4aXN0cyk7XG4gICAgICB9XG4gICAgICBpZiAoYWQuc2l6ZSkge1xuICAgICAgICBzbG90ID0gZ29vZ2xldGFnLmRlZmluZVNsb3QoXG4gICAgICAgICAgYWQuYWRVbml0UGF0aCxcbiAgICAgICAgICBhZC5zaXplLFxuICAgICAgICAgIGlkXG4gICAgICAgICkgYXMgZ29vZ2xldGFnLlNsb3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90ID0gZ29vZ2xldGFnLmRlZmluZU91dE9mUGFnZVNsb3QoXG4gICAgICAgICAgYWQuYWRVbml0UGF0aCxcbiAgICAgICAgICBpZFxuICAgICAgICApIGFzIGdvb2dsZXRhZy5TbG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZC5zaXplTWFwcGluZykge1xuICAgICAgc2xvdC5kZWZpbmVTaXplTWFwcGluZyhhZC5zaXplTWFwcGluZyk7XG4gICAgfVxuXG4gICAgc2xvdC5jbGVhckNhdGVnb3J5RXhjbHVzaW9ucygpO1xuXG4gICAgaWYgKGFkLmNhdGVnb3J5RXhjbHVzaW9uKSB7XG4gICAgICBpZiAoYWQuY2F0ZWdvcnlFeGNsdXNpb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBjb25zdCBzID0gc2xvdDtcbiAgICAgICAgYWQuY2F0ZWdvcnlFeGNsdXNpb24uZm9yRWFjaCgoY2F0OiBzdHJpbmcpID0+XG4gICAgICAgICAgcy5zZXRDYXRlZ29yeUV4Y2x1c2lvbihjYXQpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90LnNldENhdGVnb3J5RXhjbHVzaW9uKGFkLmNhdGVnb3J5RXhjbHVzaW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzbG90LnNldCgnYWRzZW5zZV9iYWNrZ3JvdW5kX2NvbG9yJywgJyMwMDAwMDAnKTtcblxuICAgIGlmICh0eXBlb2YgYWQuZm9yY2VTYWZlRnJhbWUgPT09ICdib29sZWFuJykge1xuICAgICAgc2xvdC5zZXRGb3JjZVNhZmVGcmFtZShhZC5mb3JjZVNhZmVGcmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGFkLnNhZmVGcmFtZUNvbmZpZykge1xuICAgICAgc2xvdC5zZXRTYWZlRnJhbWVDb25maWcoYWQuc2FmZUZyYW1lQ29uZmlnKTtcbiAgICB9XG5cbiAgICBzbG90LmNsZWFyVGFyZ2V0aW5nKCk7XG4gICAgaWYgKGFkLnRhcmdldGluZykge1xuICAgICAgc2xvdC51cGRhdGVUYXJnZXRpbmdGcm9tTWFwKGFkLnRhcmdldGluZyk7XG4gICAgfVxuXG4gICAgaWYgKGFkLmNvbGxhcHNlRW1wdHlEaXYgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgc2xvdC5zZXRDb2xsYXBzZUVtcHR5RGl2KGFkLmNvbGxhcHNlRW1wdHlEaXZbMF0sIGFkLmNvbGxhcHNlRW1wdHlEaXZbMV0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFkLmNvbGxhcHNlRW1wdHlEaXYgPT09ICdib29sZWFuJykge1xuICAgICAgc2xvdC5zZXRDb2xsYXBzZUVtcHR5RGl2KGFkLmNvbGxhcHNlRW1wdHlEaXYpO1xuICAgIH1cblxuICAgIGlmIChhZC5jbGlja1VybCkge1xuICAgICAgc2xvdC5zZXRDbGlja1VybChhZC5jbGlja1VybCk7XG4gICAgfVxuXG4gICAgLy8gRXZlbnRzXG4gICAgZ29vZ2xldGFnLmNtZC5wdXNoKCgpID0+IHtcbiAgICAgIHB1YmFkcy5hZGRFdmVudExpc3RlbmVyKCdpbXByZXNzaW9uVmlld2FibGUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgYWQuaW1wcmVzc2lvblZpZXdhYmxlLmVtaXQobmV3IEltcHJlc3Npb25WaWV3YWJsZUV2ZW50KGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICAgIHB1YmFkcy5hZGRFdmVudExpc3RlbmVyKCdyZXdhcmRlZFNsb3RDbG9zZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgYWQucmV3YXJkZWRTbG90Q2xvc2VkLmVtaXQobmV3IFJld2FyZGVkU2xvdENsb3NlZEV2ZW50KGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICAgIHB1YmFkcy5hZGRFdmVudExpc3RlbmVyKCdyZXdhcmRlZFNsb3RHcmFudGVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGFkLnJld2FyZGVkU2xvdEdyYW50ZWQuZW1pdChuZXcgUmV3YXJkZWRTbG90R3JhbnRlZEV2ZW50KGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICAgIHB1YmFkcy5hZGRFdmVudExpc3RlbmVyKCdyZXdhcmRlZFNsb3RSZWFkeScsIChldmVudCkgPT4ge1xuICAgICAgICBhZC5yZXdhcmRlZFNsb3RSZWFkeS5lbWl0KG5ldyBSZXdhcmRlZFNsb3RHcmFudGVkRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgICAgcHViYWRzLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RPbmxvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgYWQuc2xvdE9ubG9hZC5lbWl0KG5ldyBTbG90T25sb2FkRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgICAgcHViYWRzLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RSZW5kZXJFbmRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICBhZC5zbG90UmVuZGVyRW5kZWQuZW1pdChuZXcgU2xvdFJlbmRlckVuZGVkRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgICAgcHViYWRzLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RSZXF1ZXN0ZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgYWQuc2xvdFJlcXVlc3RlZC5lbWl0KG5ldyBTbG90UmVxdWVzdGVkRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgICAgcHViYWRzLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RSZXNwb25zZVJlY2VpdmVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGFkLnNsb3RSZXNwb25zZVJlY2VpdmVkLmVtaXQobmV3IFNsb3RSZXNwb25zZVJlY2VpdmVkKGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICAgIHB1YmFkcy5hZGRFdmVudExpc3RlbmVyKCdzbG90VmlzaWJpbGl0eUNoYW5nZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgYWQuc2xvdFZpc2liaWxpdHlDaGFuZ2VkLmVtaXQobmV3IFNsb3RWaXNpYmlsaXR5Q2hhbmdlZEV2ZW50KGV2ZW50KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNsb3QuYWRkU2VydmljZShnb29nbGV0YWcucHViYWRzKCkpO1xuXG4gICAgZ29vZ2xldGFnLmVuYWJsZVNlcnZpY2VzKCk7XG5cbiAgICByZXR1cm4gc2xvdDtcbiAgfVxuXG4gIGRpc3BsYXkoc2xvdDogZ29vZ2xldGFnLlNsb3QpOiB2b2lkIHtcbiAgICB0aGlzLiRzaW5nbGVSZXF1ZXN0Lm5leHQobmV3IERpc3BsYXlTbG90KHNsb3QpKTtcbiAgfVxuXG4gIHJlZnJlc2goc2xvdDogZ29vZ2xldGFnLlNsb3QpOiB2b2lkIHtcbiAgICB0aGlzLiRzaW5nbGVSZXF1ZXN0Lm5leHQobmV3IFJlZnJlc2hTbG90KHNsb3QpKTtcbiAgfVxuXG4gIGRlc3Ryb3koc2xvdDogZ29vZ2xldGFnLlNsb3QpOiB2b2lkIHtcbiAgICBnb29nbGV0YWcuZGVzdHJveVNsb3RzKFtzbG90XSk7XG4gIH1cblxuICBnZXRTbG90KGlkOiBzdHJpbmcpOiBnb29nbGV0YWcuU2xvdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2xvdHMoKS5maW5kKChzbG90KSA9PiBzbG90LmdldFNsb3RFbGVtZW50SWQoKSA9PT0gaWQpO1xuICB9XG5cbiAgZ2V0U2xvdHMoaWRzPzogc3RyaW5nW10pOiBnb29nbGV0YWcuU2xvdFtdIHtcbiAgICBjb25zdCBzbG90czogZ29vZ2xldGFnLlNsb3RbXSA9IGdvb2dsZXRhZy5wdWJhZHMoKS5nZXRTbG90cygpO1xuXG4gICAgcmV0dXJuIHNsb3RzLmZpbHRlcihcbiAgICAgIChzbG90KSA9PiAhaWRzIHx8IGlkcy5pbmNsdWRlcyhzbG90LmdldFNsb3RFbGVtZW50SWQoKSlcbiAgICApO1xuICB9XG5cbiAgZGVmaW5lVGFzayh0YXNrOiAoKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIGdvb2dsZXRhZy5jbWQucHVzaCh0YXNrKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==