@pangz/ng-cloudflare-turnstile
Version:
An intuitive, lightweight and easy to integrate cloudflare-turnstile component for Angular.
364 lines • 49.7 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
export var DevSiteKey;
(function (DevSiteKey) {
DevSiteKey["ALWAYS_PASSES"] = "1x00000000000000000000AA";
DevSiteKey["ALWAYS_BLOCKS"] = "2x00000000000000000000AB";
DevSiteKey["ALWAYS_PASSES_INVISIBLE"] = "1x00000000000000000000BB";
DevSiteKey["ALWAYS_BLOCKS_INVISIBLE"] = "2x00000000000000000000BB";
DevSiteKey["FORCE_INTERACTIVE_CHALLENGE"] = "3x00000000000000000000FF";
})(DevSiteKey || (DevSiteKey = {}));
export var Language;
(function (Language) {
Language["AUTO"] = "auto";
Language["ARABIC"] = "ar-eg";
Language["BULGARIAN"] = "bg-bg";
Language["CHINESE_SIMPLIFIED"] = "zh-cn";
Language["CHINESE_TRADITIONAL"] = "zh-tw";
Language["CROATIAN"] = "hr-hr";
Language["CZECH"] = "cs-cz";
Language["DANISH"] = "da-dk";
Language["DUTCH"] = "nl-nl";
Language["ENGLISH"] = "en-us";
Language["FARSI"] = "fa-ir";
Language["FINNISH"] = "fi-fi";
Language["FRENCH"] = "fr-fr";
Language["GERMAN"] = "de-de";
Language["GREEK"] = "el-gr";
Language["HEBREW"] = "he-il";
Language["HINDI"] = "hi-in";
Language["HUNGARIAN"] = "hu-hu";
Language["INDONESIAN"] = "id-id";
Language["ITALIAN"] = "it-it";
Language["JAPANESE"] = "ja-jp";
Language["KLINGON"] = "tlh";
Language["KOREAN"] = "ko-kr";
Language["LITHUANIAN"] = "lt-lt";
Language["MALAY"] = "ms-my";
Language["NORWEGIAN"] = "nb-no";
Language["POLISH"] = "pl-pl";
Language["PORTUGUESE"] = "pt-br";
Language["ROMANIAN"] = "ro-ro";
Language["RUSSIAN"] = "ru-ru";
Language["SERBIAN"] = "sr-ba";
Language["SLOVAK"] = "sk-sk";
Language["SLOVENIAN"] = "sl-si";
Language["SPANISH"] = "es-es";
Language["SWEDISH"] = "sv-se";
Language["TAGALOG"] = "tl-ph";
Language["THAI"] = "th-th";
Language["TURKISH"] = "tr-tr";
Language["UKRAINIAN"] = "uk-ua";
Language["VIETNAMESE"] = "vi-vn";
})(Language || (Language = {}));
export var Theme;
(function (Theme) {
Theme["LIGHT"] = "light";
Theme["DARK"] = "dark";
Theme["AUTO"] = "auto";
})(Theme || (Theme = {}));
export var Size;
(function (Size) {
Size["NORMAL"] = "normal";
Size["FLEXIBLE"] = "flexible";
Size["COMPACT"] = "compact";
})(Size || (Size = {}));
export var Appearance;
(function (Appearance) {
Appearance["ALWAYS"] = "always";
Appearance["EXECUTE"] = "execute";
Appearance["INTERACTION_ONLY"] = "interaction-only";
})(Appearance || (Appearance = {}));
export var Retry;
(function (Retry) {
Retry["AUTO"] = "auto";
Retry["NEVER"] = "never";
})(Retry || (Retry = {}));
export var RefreshExpiry;
(function (RefreshExpiry) {
RefreshExpiry["AUTO"] = "auto";
RefreshExpiry["MANUAL"] = "manual";
RefreshExpiry["NEVER"] = "never";
})(RefreshExpiry || (RefreshExpiry = {}));
export var RefreshTimeout;
(function (RefreshTimeout) {
RefreshTimeout["AUTO"] = "auto";
RefreshTimeout["MANUAL"] = "manual";
RefreshTimeout["NEVER"] = "never";
})(RefreshTimeout || (RefreshTimeout = {}));
export var State;
(function (State) {
State[State["SUCCESS"] = 0] = "SUCCESS";
State[State["WIDGET_CREATED"] = 1] = "WIDGET_CREATED";
State[State["WIDGET_REMOVED"] = 2] = "WIDGET_REMOVED";
State[State["WIDGET_RESET"] = 3] = "WIDGET_RESET";
State[State["AFTER_INTERACTIVE"] = 4] = "AFTER_INTERACTIVE";
State[State["BEFORE_INTERACTIVE"] = 5] = "BEFORE_INTERACTIVE";
State[State["ERROR"] = -1] = "ERROR";
State[State["EXPIRED"] = -2] = "EXPIRED";
State[State["TIMEOUT"] = -3] = "TIMEOUT";
})(State || (State = {}));
export class TurnstileManager {
obj;
event;
widgetId;
containerRef;
options;
constructor(obj, event, widgetId = '', containerRef = '', options = '') {
this.obj = obj;
this.event = event;
this.widgetId = widgetId;
this.containerRef = containerRef;
this.options = options;
}
reRender(options) {
this.remove(null);
this.updateOptions(options);
this.widgetId = this.obj.render(this.containerRef, this.options);
const payload = { name: 'WIDGET_CREATED', data: this.widgetId, result: State.WIDGET_CREATED, manager: this };
this.options.onCreate(payload);
this.event.emit(payload);
}
reset(id) {
this.obj.reset(id ?? this.widgetId);
const payload = { name: 'WIDGET_RESET', data: id, result: State.WIDGET_RESET, manager: this };
this.options.onReset(payload);
this.event.emit(payload);
}
remove(id) {
this.obj.remove(id ?? this.widgetId);
const payload = { name: 'WIDGET_REMOVED', data: id, result: State.WIDGET_REMOVED, manager: this };
this.options.onRemove(payload);
this.event.emit(payload);
}
updateOptions(options) {
if (this.options.sitekey !== options.siteKey) {
this.options.sitekey = options.siteKey;
}
if (this.options.action !== options.action) {
this.options.action = options.action;
}
if (this.options.cData !== options.cData) {
this.options.cData = options.cData;
}
if (this.options.tabindex !== options.tabIndex) {
this.options.tabindex = options.tabIndex;
}
if (this.options.language !== options.language) {
this.options.language = options.language;
}
if (this.options.theme !== options.theme) {
this.options.theme = options.theme;
}
if (this.options.size !== options.size) {
this.options.size = options.size;
}
if (this.options.appearance !== options.appearance) {
this.options.appearance = options.appearance;
}
if (this.options.retry !== options.retry) {
this.options.retry = options.retry;
}
if (this.options['retry-interval'] !== options.retryInterval) {
this.options['retry-interval'] = options.retryInterval;
}
if (this.options['refresh-expired'] !== options.refreshExpired) {
this.options['refresh-expired'] = options.refreshExpired;
}
if (this.options['refresh-timeout'] !== options.refreshTimeout) {
this.options['refresh-timeout'] = options.refreshTimeout;
}
if (this.options['response-field'] !== options.responseField) {
this.options['response-field'] = options.responseField;
}
if (this.options['feedback-enabled'] !== options.feedbackEnabled) {
this.options['feedback-enabled'] = options.feedbackEnabled;
}
}
}
class EventHandler {
static widgetId;
static tsManager;
static event;
static config = {
siteKey: '',
action: '',
cData: '',
tabIndex: 0,
language: Language.AUTO,
theme: Theme.AUTO,
size: Size.NORMAL,
appearance: Appearance.ALWAYS,
retry: Retry.AUTO,
retryInterval: 8000,
refreshExpired: RefreshExpiry.AUTO,
refreshTimeout: RefreshTimeout.AUTO,
responseField: true,
feedbackEnabled: true,
onSuccess: (_) => { },
onError: (_) => { },
onExpired: (_) => { },
onBeforeInteractive: (_) => { },
onAfterInteractive: (_) => { },
onTimeout: (_) => { },
onCreate: (_) => { },
onReset: (_) => { },
onRemove: (_) => { },
};
static init(e, config, manager, widgetId = '') {
EventHandler.event = e;
EventHandler.config = config;
EventHandler.tsManager = manager;
EventHandler.widgetId = widgetId;
}
static emit(d) {
EventHandler.event.emit(d);
}
static get e() {
return EventHandler.event;
}
static setWidgetId(id) {
EventHandler.widgetId = id;
}
static getWidgetId() {
return EventHandler.widgetId;
}
static get conf() {
return EventHandler.config;
}
static get manager() {
return EventHandler.tsManager;
}
static copyWith(p) {
if (p.manager !== null) {
EventHandler.tsManager = p.manager;
}
if (p.widgetId !== null) {
EventHandler.widgetId = p.widgetId;
}
}
}
export class NgCloudflareTurnstile {
config = {
siteKey: '',
action: '',
cData: '',
tabIndex: 0,
language: Language.AUTO,
theme: Theme.AUTO,
size: Size.NORMAL,
appearance: Appearance.ALWAYS,
retry: Retry.AUTO,
retryInterval: 8000,
refreshExpired: RefreshExpiry.AUTO,
refreshTimeout: RefreshTimeout.AUTO,
responseField: true,
feedbackEnabled: true,
onSuccess: (_) => { },
onError: (_) => { },
onExpired: (_) => { },
onBeforeInteractive: (_) => { },
onAfterInteractive: (_) => { },
onTimeout: (_) => { },
onCreate: (_) => { },
onReset: (_) => { },
onRemove: (_) => { },
};
event = new EventEmitter();
constructor() {
window.onloadTurnstileCallback = function () {
const conf = EventHandler.conf;
const containerRef = "#cf-container";
const renderingConf = {
sitekey: conf.siteKey,
action: conf.action,
cData: conf.cData,
tabindex: conf.tabIndex,
language: conf.language,
theme: conf.theme,
size: conf.size,
appearance: conf.appearance,
retry: conf.retry,
'retry-interval': conf.retryInterval,
'refresh-expired': conf.refreshExpired,
'refresh-timeout': conf.refreshTimeout,
'response-field': conf.responseField,
'feedback-enabled': conf.feedbackEnabled,
callback: (token) => {
const payload = { name: 'SUCCESS', data: token, result: State.SUCCESS, manager: EventHandler.manager };
EventHandler.conf.onSuccess(payload);
EventHandler.emit(payload);
},
'error-callback': (code) => {
const payload = { name: 'ERROR', data: code, result: State.ERROR, manager: EventHandler.manager };
EventHandler.conf.onError(payload);
EventHandler.emit(payload);
},
'expired-callback': (d) => {
const payload = { name: 'EXPIRED', data: d, result: State.EXPIRED, manager: EventHandler.manager };
EventHandler.conf.onExpired(payload);
EventHandler.emit(payload);
},
'before-interactive-callback': (d) => {
const payload = { name: 'BEFORE_INTERACTIVE', data: d, result: State.BEFORE_INTERACTIVE, manager: EventHandler.manager };
EventHandler.conf.onBeforeInteractive(payload);
EventHandler.emit(payload);
},
'after-interactive-callback': (d) => {
const payload = { name: 'AFTER_INTERACTIVE', data: d, result: State.AFTER_INTERACTIVE, manager: EventHandler.manager };
EventHandler.conf.onAfterInteractive(payload);
EventHandler.emit(payload);
},
'timeout-callback': (d) => {
const payload = { name: 'TIMEOUT', data: d, result: State.TIMEOUT, manager: EventHandler.manager };
EventHandler.conf.onTimeout(payload);
EventHandler.emit(payload);
},
// Add the custom callback
onSuccess: conf.onSuccess,
onError: conf.onError,
onExpired: conf.onExpired,
onBeforeInteractive: conf.onBeforeInteractive,
onAfterInteractive: conf.onAfterInteractive,
onTimeout: conf.onTimeout,
onCreate: conf.onCreate,
onReset: conf.onReset,
onRemove: conf.onRemove,
};
const widgetId = window.turnstile.render(containerRef, renderingConf);
EventHandler.setWidgetId(widgetId);
EventHandler.copyWith({ manager: new TurnstileManager(window.turnstile, EventHandler.e, widgetId, containerRef, renderingConf) });
const payload = { name: 'WIDGET_CREATED', data: widgetId, result: State.WIDGET_CREATED, manager: EventHandler.manager };
EventHandler.conf.onCreate(payload);
EventHandler.emit(payload);
};
}
ngOnInit() {
EventHandler.init(this.event, this.config, new TurnstileManager(window.turnstile, this.event));
if (window.turnstile) {
window.onloadTurnstileCallback();
}
}
ngAfterViewInit() { this.loadTurnstileScript(); }
loadTurnstileScript() {
// Check if script is already loaded to avoid duplicates
if (!document.querySelector('script[src*="turnstile"]')) {
const script = document.createElement('script');
script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback';
script.async = true;
script.defer = true;
document.head.appendChild(script);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgCloudflareTurnstile, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgCloudflareTurnstile, isStandalone: true, selector: "ng-cloudflare-turnstile", inputs: { config: "config" }, outputs: { event: "event" }, ngImport: i0, template: `<div id="cf-container"></div>`, isInline: true, styles: [""] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgCloudflareTurnstile, decorators: [{
type: Component,
args: [{ selector: 'ng-cloudflare-turnstile', standalone: true, imports: [], template: `<div id="cf-container"></div>` }]
}], ctorParameters: () => [], propDecorators: { config: [{
type: Input
}], event: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2xvdWRmbGFyZS10dXJuc3RpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY2xvdWRmbGFyZS10dXJuc3RpbGUvc3JjL2xpYi9uZy1jbG91ZGZsYXJlLXR1cm5zdGlsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBbUMsTUFBTSxlQUFlLENBQUM7O0FBbUJ4RyxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ2xCLHdEQUEwQyxDQUFBO0lBQzFDLHdEQUEwQyxDQUFBO0lBQzFDLGtFQUFvRCxDQUFBO0lBQ3BELGtFQUFvRCxDQUFBO0lBQ3BELHNFQUF3RCxDQUFBO0FBQzVELENBQUMsRUFOVyxVQUFVLEtBQVYsVUFBVSxRQU1yQjtBQUVELE1BQU0sQ0FBTixJQUFZLFFBeUNYO0FBekNELFdBQVksUUFBUTtJQUNoQix5QkFBYSxDQUFBO0lBQ2IsNEJBQWdCLENBQUE7SUFDaEIsK0JBQW1CLENBQUE7SUFDbkIsd0NBQTRCLENBQUE7SUFDNUIseUNBQTZCLENBQUE7SUFDN0IsOEJBQWtCLENBQUE7SUFDbEIsMkJBQWUsQ0FBQTtJQUNmLDRCQUFnQixDQUFBO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiw2QkFBaUIsQ0FBQTtJQUNqQiwyQkFBZSxDQUFBO0lBQ2YsNkJBQWlCLENBQUE7SUFDakIsNEJBQWdCLENBQUE7SUFDaEIsNEJBQWdCLENBQUE7SUFDaEIsMkJBQWUsQ0FBQTtJQUNmLDRCQUFnQixDQUFBO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiwrQkFBbUIsQ0FBQTtJQUNuQixnQ0FBb0IsQ0FBQTtJQUNwQiw2QkFBaUIsQ0FBQTtJQUNqQiw4QkFBa0IsQ0FBQTtJQUNsQiwyQkFBZSxDQUFBO0lBQ2YsNEJBQWdCLENBQUE7SUFDaEIsZ0NBQW9CLENB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akMsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUMsQ0FBQztRQUN4RixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ3BGLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDaEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUMsQ0FBQztRQUM1RixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFBQyxDQUFDO1FBQzVGLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDaEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxD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LHNHQUFzRyxDQUFDO1lBQ3BILE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDTCxDQUFDO3dHQW5IUSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw4SUFIcEIsK0JBQStCOzs0RkFHaEMscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsRUFBRSxZQUNELCtCQUErQjt3REFJaEMsTUFBTTtzQkFBZCxLQUFLO2dCQXlCSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgdHlwZSBBZnRlclZpZXdJbml0LCB0eXBlIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG9ubG9hZFR1cm5zdGlsZUNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgICAgICB0dXJuc3RpbGU6IHtcbiAgICAgICAgICAgIHJlbmRlcjogKFxuICAgICAgICAgICAgICAgIGlkT3JDb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGFueSxcbiAgICAgICAgICAgICkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcmVzZXQ6ICh3aWRnZXRJZE9yQ29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbiAgICAgICAgICAgIGdldFJlc3BvbnNlOiAoXG4gICAgICAgICAgICAgICAgd2lkZ2V0SWRPckNvbnRhaW5lcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICApID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJlbW92ZTogKHdpZGdldElkT3JDb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGV2U2l0ZUtleSB7XG4gICAgQUxXQVlTX1BBU1NFUyA9ICcxeDAwMDAwMDAwMDAwMDAwMDAwMDAwQUEnLFxuICAgIEFMV0FZU19CTE9DS1MgPSAnMngwMDAwMDAwMDAwMDAwMDAwMDAwMEFCJyxcbiAgICBBTFdBWVNfUEFTU0VTX0lOVklTSUJMRSA9ICcxeDAwMDAwMDAwMDAwMDAwMDAwMDAwQkInLFxuICAgIEFMV0FZU19CTE9DS1NfSU5WSVNJQkxFID0gJzJ4MDAwMDAwMDAwMDAwMDAwMDAwMDBCQicsXG4gICAgRk9SQ0VfSU5URVJBQ1RJVkVfQ0hBTExFTkdFID0gJzN4MDAwMDAwMDAwMDAwMDAwMDAwMDBGRicsXG59XG5cbmV4cG9ydCBlbnVtIExhbmd1YWdlIHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIEFSQUJJQyA9ICdhci1lZycsXG4gICAgQlVMR0FSSUFOID0gJ2JnLWJnJyxcbiAgICBDSElORVNFX1NJTVBMSUZJRUQgPSAnemgtY24nLFxuICAgIENISU5FU0VfVFJBRElUSU9OQUwgPSAnemgtdHcnLFxuICAgIENST0FUSUFOID0gJ2hyLWhyJyxcbiAgICBDWkVDSCA9ICdjcy1jeicsXG4gICAgREFOSVNIID0gJ2RhLWRrJyxcbiAgICBEVVRDSCA9ICdubC1ubCcsXG4gICAgRU5HTElTSCA9ICdlbi11cycsXG4gICAgRkFSU0kgPSAnZmEtaXInLFxuICAgIEZJTk5JU0ggPSAnZmktZmknLFxuICAgIEZSRU5DSCA9ICdmci1mcicsXG4gICAgR0VSTUFOID0gJ2RlLWRlJyxcbiAgICBHUkVFSyA9ICdlbC1ncicsXG4gICAgSEVCUkVXID0gJ2hlLWlsJyxcbiAgICBISU5ESSA9ICdoaS1pbicsXG4gICAgSFVOR0FSSUFOID0gJ2h1LWh1JyxcbiAgICBJTkRPTkVTSUFOID0gJ2lkLWlkJyxcbiAgICBJVEFMSUFOID0gJ2l0LWl0JyxcbiAgICBKQVBBTkVTRSA9ICdqYS1qcCcsXG4gICAgS0xJTkdPTiA9ICd0bGgnLFxuICAgIEtPUkVBTiA9ICdrby1rcicsXG4gICAgTElUSFVBTklBTiA9ICdsdC1sdCcsXG4gICAgTUFMQVkgPSAnbXMtbXknLFxuICAgIE5PUldFR0lBTiA9ICduYi1ubycsXG4gICAgUE9MSVNIID0gJ3BsLXBsJyxcbiAgICBQT1JUVUdVRVNFID0gJ3B0LWJyJyxcbiAgICBST01BTklBTiA9ICdyby1ybycsXG4gICAgUlVTU0lBTiA9ICdydS1ydScsXG4gICAgU0VSQklBTiA9ICdzci1iYScsXG4gICAgU0xPVkFLID0gJ3NrLXNrJyxcbiAgICBTTE9WRU5JQU4gPSAnc2wtc2knLFxuICAgIFNQQU5JU0ggPSAnZXMtZXMnLFxuICAgIFNXRURJU0ggPSAnc3Ytc2UnLFxuICAgIFRBR0FMT0cgPSAndGwtcGgnLFxuICAgIFRIQUkgPSAndGgtdGgnLFxuICAgIFRVUktJU0ggPSAndHItdHInLFxuICAgIFVLUkFJTklBTiA9ICd1ay11YScsXG4gICAgVklFVE5BTUVTRSA9ICd2aS12bidcbn1cblxuZXhwb3J0IGVudW0gVGhlbWUge1xuICAgIExJR0hUID0gJ2xpZ2h0JyxcbiAgICBEQVJLID0gJ2RhcmsnLFxuICAgIEFVVE8gPSAnYXV0bycsXG59XG5cbmV4cG9ydCBlbnVtIFNpemUge1xuICAgIE5PUk1BTCA9ICdub3JtYWwnLFxuICAgIEZMRVhJQkxFID0gJ2ZsZXhpYmxlJyxcbiAgICBDT01QQUNUID0gJ2NvbXBhY3QnLFxufVxuXG5leHBvcnQgZW51bSBBcHBlYXJhbmNlIHtcbiAgICBBTFdBWVMgPSAnYWx3YXlzJyxcbiAgICBFWEVDVVRFID0gJ2V4ZWN1dGUnLFxuICAgIElOVEVSQUNUSU9OX09OTFkgPSAnaW50ZXJhY3Rpb24tb25seScsXG59XG5cbmV4cG9ydCBlbnVtIFJldHJ5IHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIE5FVkVSID0gJ25ldmVyJyxcbn1cblxuZXhwb3J0IGVudW0gUmVmcmVzaEV4cGlyeSB7XG4gICAgQVVUTyA9ICdhdXRvJyxcbiAgICBNQU5VQUwgPSAnbWFudWFsJyxcbiAgICBORVZFUiA9ICduZXZlcicsXG59XG5cbmV4cG9ydCBlbnVtIFJlZnJlc2hUaW1lb3V0IHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIE1BTlVBTCA9ICdtYW51YWwnLFxuICAgIE5FVkVSID0gJ25ldmVyJyxcbn1cblxuZXhwb3J0IGVudW0gU3RhdGUge1xuICAgIFNVQ0NFU1MgPSAwLFxuICAgIFdJREdFVF9DUkVBVEVEID0gMSxcbiAgICBXSURHRVRfUkVNT1ZFRCA9IDIsXG4gICAgV0lER0VUX1JFU0VUID0gMyxcbiAgICBBRlRFUl9JTlRFUkFDVElWRSA9IDQsXG4gICAgQkVGT1JFX0lOVEVSQUNUSVZFID0gNSxcbiAgICBFUlJPUiA9IC0xLFxuICAgIEVYUElSRUQgPSAtMixcbiAgICBUSU1FT1VUID0gLTMsXG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGF0YT86IGFueVxuICAgIHJlc3VsdDogbnVtYmVyLFxuICAgIG1hbmFnZXI6IFR1cm5zdGlsZU1hbmFnZXJcbn1cblxuZXhwb3J0IHR5cGUgRXZlbnRDYWxsYmFjayA9IChkOiBSZXN1bHQpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25maWcgPSB7XG4gICAgc2l0ZUtleTogc3RyaW5nO1xuICAgIGFjdGlvbj86IHN0cmluZztcbiAgICBjRGF0YT86IHN0cmluZztcbiAgICB0YWJJbmRleD86IG51bWJlcjtcbiAgICBsYW5ndWFnZT86IExhbmd1YWdlO1xuICAgIHRoZW1lPzogVGhlbWU7XG4gICAgcmVzcG9uc2VGaWVsZD86IGJvb2xlYW47XG4gICAgc2l6ZT86IFNpemU7XG4gICAgYXBwZWFyYW5jZT86IEFwcGVhcmFuY2U7XG4gICAgcmV0cnk/OiBSZXRyeTtcbiAgICByZXRyeUludGVydmFsPzogbnVtYmVyO1xuICAgIHJlZnJlc2hFeHBpcmVkPzogUmVmcmVzaEV4cGlyeTtcbiAgICByZWZyZXNoVGltZW91dD86IFJlZnJlc2hUaW1lb3V0O1xuICAgIGZlZWRiYWNrRW5hYmxlZD86IGJvb2xlYW47XG4gICAgb25TdWNjZXNzPzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkVycm9yPzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkV4cGlyZWQ/OiBFdmVudENhbGxiYWNrLFxuICAgIG9uQmVmb3JlSW50ZXJhY3RpdmU/OiBFdmVudENhbGxiYWNrLFxuICAgIG9uQWZ0ZXJJbnRlcmFjdGl2ZT86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25UaW1lb3V0PzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkNyZWF0ZT86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25SZXNldD86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25SZW1vdmU/OiBFdmVudENhbGxiYWNrLFxufVxuXG5leHBvcnQgY2xhc3MgVHVybnN0aWxlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgb2JqOiBhbnksXG4gICAgICAgIHByaXZhdGUgZXZlbnQ6IEV2ZW50RW1pdHRlcjxSZXN1bHQ+LFxuICAgICAgICBwcml2YXRlIHdpZGdldElkOiBzdHJpbmcgPSAnJyxcbiAgICAgICAgcHJpdmF0ZSBjb250YWluZXJSZWY6IHN0cmluZyB8IEhUTUxFbGVtZW50ID0gJycsXG4gICAgICAgIHByaXZhdGUgb3B0aW9uczogYW55ID0gJydcbiAgICApIHt9XG5cbiAgICByZVJlbmRlcihvcHRpb25zOiBDb25maWcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmUobnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy53aWRnZXRJZCA9IHRoaXMub2JqLnJlbmRlcih0aGlzLmNvbnRhaW5lclJlZiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdXSURHRVRfQ1JFQVRFRCcsIGRhdGE6IHRoaXMud2lkZ2V0SWQsIHJlc3VsdDogU3RhdGUuV0lER0VUX0NSRUFURUQsIG1hbmFnZXI6IHRoaXN9XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5ldmVudC5lbWl0KHBheWxvYWQpO1xuICAgIH1cblxuICAgIHJlc2V0KGlkOiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYmoucmVzZXQoaWQgPz8gdGhpcy53aWRnZXRJZCk7XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1dJREdFVF9SRVNFVCcsIGRhdGE6IGlkLCByZXN1bHQ6IFN0YXRlLldJREdFVF9SRVNFVCwgbWFuYWdlcjogdGhpc307XG4gICAgICAgIHRoaXMub3B0aW9ucy5vblJlc2V0KHBheWxvYWQpO1xuICAgICAgICB0aGlzLmV2ZW50LmVtaXQocGF5bG9hZCk7XG4gICAgfVxuICAgIFxuICAgIHJlbW92ZShpZDogc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JqLnJlbW92ZShpZCA/PyB0aGlzLndpZGdldElkKTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBuYW1lOiAnV0lER0VUX1JFTU9WRUQnLCBkYXRhOiBpZCwgcmVzdWx0OiBTdGF0ZS5XSURHRVRfUkVNT1ZFRCwgbWFuYWdlcjogdGhpc307XG4gICAgICAgIHRoaXMub3B0aW9ucy5vblJlbW92ZShwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5ldmVudC5lbWl0KHBheWxvYWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3B0aW9ucyhvcHRpb25zOiBDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNpdGVrZXkgIT09IG9wdGlvbnMuc2l0ZUtleSkgeyB0aGlzLm9wdGlvbnMuc2l0ZWtleSA9IG9wdGlvbnMuc2l0ZUtleTsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuYWN0aW9uICE9PSBvcHRpb25zLmFjdGlvbikgeyB0aGlzLm9wdGlvbnMuYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmNEYXRhICE9PSBvcHRpb25zLmNEYXRhKSB7IHRoaXMub3B0aW9ucy5jRGF0YSA9IG9wdGlvbnMuY0RhdGE7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRhYmluZGV4ICE9PSBvcHRpb25zLnRhYkluZGV4KSB7IHRoaXMub3B0aW9ucy50YWJpbmRleCA9IG9wdGlvbnMudGFiSW5kZXg7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmxhbmd1YWdlICE9PSBvcHRpb25zLmxhbmd1YWdlKSB7IHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9IG9wdGlvbnMubGFuZ3VhZ2U7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRoZW1lICE9PSBvcHRpb25zLnRoZW1lKSB7IHRoaXMub3B0aW9ucy50aGVtZSA9IG9wdGlvbnMudGhlbWU7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNpemUgIT09IG9wdGlvbnMuc2l6ZSkgeyB0aGlzLm9wdGlvbnMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZSAhPT0gb3B0aW9ucy5hcHBlYXJhbmNlKSB7IHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlID0gb3B0aW9ucy5hcHBlYXJhbmNlOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5yZXRyeSAhPT0gb3B0aW9ucy5yZXRyeSkgeyB0aGlzLm9wdGlvbnMucmV0cnkgPSBvcHRpb25zLnJldHJ5OyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1sncmV0cnktaW50ZXJ2YWwnXSAhPT0gb3B0aW9ucy5yZXRyeUludGVydmFsKSB7IHRoaXMub3B0aW9uc1sncmV0cnktaW50ZXJ2YWwnXSA9IG9wdGlvbnMucmV0cnlJbnRlcnZhbDsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnNbJ3JlZnJlc2gtZXhwaXJlZCddICE9PSBvcHRpb25zLnJlZnJlc2hFeHBpcmVkKSB7IHRoaXMub3B0aW9uc1sncmVmcmVzaC1leHBpcmVkJ10gPSBvcHRpb25zLnJlZnJlc2hFeHBpcmVkOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1sncmVmcmVzaC10aW1lb3V0J10gIT09IG9wdGlvbnMucmVmcmVzaFRpbWVvdXQpIHsgdGhpcy5vcHRpb25zWydyZWZyZXNoLXRpbWVvdXQnXSA9IG9wdGlvbnMucmVmcmVzaFRpbWVvdXQ7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zWydyZXNwb25zZS1maWVsZCddICE9PSBvcHRpb25zLnJlc3BvbnNlRmllbGQpIHsgdGhpcy5vcHRpb25zWydyZXNwb25zZS1maWVsZCddID0gb3B0aW9ucy5yZXNwb25zZUZpZWxkOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1snZmVlZGJhY2stZW5hYmxlZCddICE9PSBvcHRpb25zLmZlZWRiYWNrRW5hYmxlZCkgeyB0aGlzLm9wdGlvbnNbJ2ZlZWRiYWNrLWVuYWJsZWQnXSA9IG9wdGlvbnMuZmVlZGJhY2tFbmFibGVkOyB9XG4gICAgfVxufVxuXG5jbGFzcyBFdmVudEhhbmRsZXIge1xuICAgIHByaXZhdGUgc3RhdGljIHdpZGdldElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdHNNYW5hZ2VyOiBUdXJuc3RpbGVNYW5hZ2VyO1xuICAgIHByaXZhdGUgc3RhdGljIGV2ZW50OiBFdmVudEVtaXR0ZXI8UmVzdWx0PjtcbiAgICBwcml2YXRlIHN0YXRpYyBjb25maWc6IENvbmZpZyA9IHtcbiAgICAgICAgc2l0ZUtleTogJycsXG4gICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgIGNEYXRhOiAnJyxcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIGxhbmd1YWdlOiBMYW5ndWFnZS5BVVRPLFxuICAgICAgICB0aGVtZTogVGhlbWUuQVVUTyxcbiAgICAgICAgc2l6ZTogU2l6ZS5OT1JNQUwsXG4gICAgICAgIGFwcGVhcmFuY2U6IEFwcGVhcmFuY2UuQUxXQVlTLFxuICAgICAgICByZXRyeTogUmV0cnkuQVVUTyxcbiAgICAgICAgcmV0cnlJbnRlcnZhbDogODAwMCxcbiAgICAgICAgcmVmcmVzaEV4cGlyZWQ6IFJlZnJlc2hFeHBpcnkuQVVUTyxcbiAgICAgICAgcmVmcmVzaFRpbWVvdXQ6IFJlZnJlc2hUaW1lb3V0LkFVVE8sXG4gICAgICAgIHJlc3BvbnNlRmllbGQ6IHRydWUsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgb25TdWNjZXNzOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25FcnJvcjogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uRXhwaXJlZDogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uQmVmb3JlSW50ZXJhY3RpdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkFmdGVySW50ZXJhY3RpdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblRpbWVvdXQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkNyZWF0ZTogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uUmVzZXQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblJlbW92ZTogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgfTtcblxuICAgIHN0YXRpYyBpbml0KGU6IEV2ZW50RW1pdHRlcjxSZXN1bHQ+LCBjb25maWc6IENvbmZpZywgbWFuYWdlcjogVHVybnN0aWxlTWFuYWdlciwgd2lkZ2V0SWQgPSAnJyk6IHZvaWQge1xuICAgICAgICBFdmVudEhhbmRsZXIuZXZlbnQgPSBlO1xuICAgICAgICBFdmVudEhhbmRsZXIuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBFdmVudEhhbmRsZXIudHNNYW5hZ2VyID0gbWFuYWdlcjtcbiAgICAgICAgRXZlbnRIYW5kbGVyLndpZGdldElkID0gd2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGVtaXQoZDogUmVzdWx0KTogdm9pZCB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5ldmVudC5lbWl0KGQpO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGUoKTogRXZlbnRFbWl0dGVyPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLmV2ZW50O1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRXaWRnZXRJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEV2ZW50SGFuZGxlci53aWRnZXRJZCA9IGlkO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0V2lkZ2V0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGNvbmYoKTogQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci5jb25maWc7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXQgbWFuYWdlcigpOiBUdXJuc3RpbGVNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci50c01hbmFnZXI7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHlXaXRoKHA6IHtcbiAgICAgICAgbWFuYWdlcj86IFR1cm5zdGlsZU1hbmFnZXIsXG4gICAgICAgIHdpZGdldElkPzogc3RyaW5nLFxuICAgIH0pOiB2b2lkIHtcbiAgICAgICAgaWYocC5tYW5hZ2VyICE9PSBudWxsKSB7IEV2ZW50SGFuZGxlci50c01hbmFnZXIgPSBwLm1hbmFnZXIhOyB9XG4gICAgICAgIGlmKHAud2lkZ2V0SWQgIT09IG51bGwpIHsgRXZlbnRIYW5kbGVyLndpZGdldElkID0gcC53aWRnZXRJZCE7IH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmctY2xvdWRmbGFyZS10dXJuc3RpbGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW10sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGlkPVwiY2YtY29udGFpbmVyXCI+PC9kaXY+YCxcbiAgICBzdHlsZXM6IGBgXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2xvdWRmbGFyZVR1cm5zdGlsZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gICAgQElucHV0KCkgY29uZmlnOiBDb25maWcgPSB7XG4gICAgICAgIHNpdGVLZXk6ICcnLFxuICAgICAgICBhY3Rpb246ICcnLFxuICAgICAgICBjRGF0YTogJycsXG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICBsYW5ndWFnZTogTGFuZ3VhZ2UuQVVUTyxcbiAgICAgICAgdGhlbWU6IFRoZW1lLkFVVE8sXG4gICAgICAgIHNpemU6IFNpemUuTk9STUFMLFxuICAgICAgICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlLkFMV0FZUyxcbiAgICAgICAgcmV0cnk6IFJldHJ5LkFVVE8sXG4gICAgICAgIHJldHJ5SW50ZXJ2YWw6IDgwMDAsXG4gICAgICAgIHJlZnJlc2hFeHBpcmVkOiBSZWZyZXNoRXhwaXJ5LkFVVE8sXG4gICAgICAgIHJlZnJlc2hUaW1lb3V0OiBSZWZyZXNoVGltZW91dC5BVVRPLFxuICAgICAgICByZXNwb25zZUZpZWxkOiB0cnVlLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIG9uU3VjY2VzczogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uRXJyb3I6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkV4cGlyZWQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkJlZm9yZUludGVyYWN0aXZlOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25BZnRlckludGVyYWN0aXZlOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25UaW1lb3V0OiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25DcmVhdGU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblJlc2V0OiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25SZW1vdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgIH07XG4gICAgQE91dHB1dCgpIGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXN1bHQ+KCk7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHdpbmRvdy5vbmxvYWRUdXJuc3RpbGVDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmYgPSBFdmVudEhhbmRsZXIuY29uZjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IFwiI2NmLWNvbnRhaW5lclwiO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyaW5nQ29uZiA9IHtcbiAgICAgICAgICAgICAgICBzaXRla2V5OiBjb25mLnNpdGVLZXksXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBjb25mLmFjdGlvbixcbiAgICAgICAgICAgICAgICBjRGF0YTogY29uZi5jRGF0YSxcbiAgICAgICAgICAgICAgICB0YWJpbmRleDogY29uZi50YWJJbmRleCxcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogY29uZi5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICB0aGVtZTogY29uZi50aGVtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBjb25mLnNpemUsXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogY29uZi5hcHBlYXJhbmNlLFxuICAgICAgICAgICAgICAgIHJldHJ5OiBjb25mLnJldHJ5LFxuICAgICAgICAgICAgICAgICdyZXRyeS1pbnRlcnZhbCc6IGNvbmYucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAncmVmcmVzaC1leHBpcmVkJzogY29uZi5yZWZyZXNoRXhwaXJlZCxcbiAgICAgICAgICAgICAgICAncmVmcmVzaC10aW1lb3V0JzogY29uZi5yZWZyZXNoVGltZW91dCxcbiAgICAgICAgICAgICAgICAncmVzcG9uc2UtZmllbGQnOiBjb25mLnJlc3BvbnNlRmllbGQsXG4gICAgICAgICAgICAgICAgJ2ZlZWRiYWNrLWVuYWJsZWQnOiBjb25mLmZlZWRiYWNrRW5hYmxlZCxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKHRva2VuOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1NVQ0NFU1MnLCBkYXRhOiB0b2tlbiwgcmVzdWx0OiBTdGF0ZS5TVUNDRVNTLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlcn07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uU3VjY2VzcyEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ2Vycm9yLWNhbGxiYWNrJzogKGNvZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBuYW1lOiAnRVJST1InLCBkYXRhOiBjb2RlLCByZXN1bHQ6IFN0YXRlLkVSUk9SLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vbkVycm9yIShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmVtaXQocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnZXhwaXJlZC1jYWxsYmFjayc6IChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ0VYUElSRUQnLCBkYXRhOiBkLCByZXN1bHQ6IFN0YXRlLkVYUElSRUQsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyIH07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uRXhwaXJlZCEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ2JlZm9yZS1pbnRlcmFjdGl2ZS1jYWxsYmFjayc6IChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ0JFRk9SRV9JTlRFUkFDVElWRScsIGRhdGE6IGQsIHJlc3VsdDogU3RhdGUuQkVGT1JFX0lOVEVSQUNUSVZFLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vbkJlZm9yZUludGVyYWN0aXZlIShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmVtaXQocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXItaW50ZXJhY3RpdmUtY2FsbGJhY2snOiAoZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdBRlRFUl9JTlRFUkFDVElWRScsIGRhdGE6IGQsIHJlc3VsdDogU3RhdGUuQUZURVJfSU5URVJBQ1RJVkUsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyIH07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uQWZ0ZXJJbnRlcmFjdGl2ZSEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ3RpbWVvdXQtY2FsbGJhY2snOiAoZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdUSU1FT1VUJywgZGF0YTogZCwgcmVzdWx0OiBTdGF0ZS5USU1FT1VULCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vblRpbWVvdXQhKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuZW1pdChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY3VzdG9tIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgb25TdWNjZXNzOiBjb25mLm9uU3VjY2VzcyxcbiAgICAgICAgICAgICAgICBvbkVycm9yOiBjb25mLm9uRXJyb3IsXG4gICAgICAgICAgICAgICAgb25FeHBpcmVkOiBjb25mLm9uRXhwaXJlZCxcbiAgICAgICAgICAgICAgICBvbkJlZm9yZUludGVyYWN0aXZlOiBjb25mLm9uQmVmb3JlSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICAgICAgb25BZnRlckludGVyYWN0aXZlOiBjb25mLm9uQWZ0ZXJJbnRlcmFjdGl2ZSxcbiAgICAgICAgICAgICAgICBvblRpbWVvdXQ6IGNvbmYub25UaW1lb3V0LFxuICAgICAgICAgICAgICAgIG9uQ3JlYXRlOiBjb25mLm9uQ3JlYXRlLFxuICAgICAgICAgICAgICAgIG9uUmVzZXQ6IGNvbmYub25SZXNldCxcbiAgICAgICAgICAgICAgICBvblJlbW92ZTogY29uZi5vblJlbW92ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHdpbmRvdy50dXJuc3RpbGUucmVuZGVyKGNvbnRhaW5lclJlZiwgcmVuZGVyaW5nQ29uZik7XG4gICAgICAgICAgICBFdmVudEhhbmRsZXIuc2V0V2lkZ2V0SWQod2lkZ2V0SWQpO1xuICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmNvcHlXaXRoKHttYW5hZ2VyOiBuZXcgVHVybnN0aWxlTWFuYWdlcih3aW5kb3cudHVybnN0aWxlLCBFdmVudEhhbmRsZXIuZSwgd2lkZ2V0SWQsIGNvbnRhaW5lclJlZiwgcmVuZGVyaW5nQ29uZil9KTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1dJREdFVF9DUkVBVEVEJywgZGF0YTogd2lkZ2V0SWQsIHJlc3VsdDogU3RhdGUuV0lER0VUX0NSRUFURUQsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyfTtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uQ3JlYXRlIShwYXlsb2FkKTtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBFdmVudEhhbmRsZXIuaW5pdCh0aGlzLmV2ZW50LCB0aGlzLmNvbmZpZywgbmV3IFR1cm5zdGlsZU1hbmFnZXIod2luZG93LnR1cm5zdGlsZSwgdGhpcy5ldmVudCkpO1xuICAgICAgICBpZiAod2luZG93LnR1cm5zdGlsZSkge1xuICAgICAgICAgICAgd2luZG93Lm9ubG9hZFR1cm5zdGlsZUNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7IHRoaXMubG9hZFR1cm5zdGlsZVNjcmlwdCgpOyB9XG5cbiAgICBwcml2YXRlIGxvYWRUdXJuc3RpbGVTY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIHNjcmlwdCBpcyBhbHJlYWR5IGxvYWRlZCB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9XCJ0dXJuc3RpbGVcIl0nKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vY2hhbGxlbmdlcy5jbG91ZGZsYXJlLmNvbS90dXJuc3RpbGUvdjAvYXBpLmpzP3JlbmRlcj1leHBsaWNpdCZvbmxvYWQ9b25sb2FkVHVybnN0aWxlQ2FsbGJhY2snO1xuICAgICAgICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=