ngx-tag-commander-lib
Version:
This service lets you integrate Tag Commander in your AngularX (2+) applications easily. - [Official website](https://www.commandersact.com/fr/produits/tagcommander/)
448 lines • 32.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
//our root app component
import { CustomNGXLoggerService, NgxLoggerLevel } from 'ngx-logger';
import { Router, RoutesRecognized } from '@angular/router';
import { WindowRef } from './WindowRef';
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./WindowRef";
import * as i2 from "ngx-logger";
import * as i3 from "@angular/router";
var TagCommanderService = /** @class */ (function () {
function TagCommanderService(winRef, customLogger, router) {
var _this = this;
this.winRef = winRef;
this.customLogger = customLogger;
this.router = router;
this._tcContainers = [];
this._trackRoutes = false;
this.logger = customLogger.create({ level: NgxLoggerLevel.DEBUG });
this.router.events.subscribe(function (_data) {
if (_data instanceof RoutesRecognized && _this._trackRoutes) {
if (_data.state.root.firstChild.data.tcInclude === undefined) {
/** @type {?} */
var data = _data.state.root.firstChild.data.tcInclude;
data.forEach(function (container) {
_this.reloadContainer(container['ids'], container['idc'], container['options']);
});
}
}
});
}
// /**
// * the script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id the id the script node will have
// * @param {string} uri the source of the script
// * @param {string} node the node on witch the script will be placed, it can either be head or body
// */
// /**
// * the script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id the id the script node will have
// * @param {string} uri the source of the script
// * @param {string} node the node on witch the script will be placed, it can either be head or body
// */
/**
* @param {?} id
* @param {?} uri
* @param {?} node
* @return {?}
*/
TagCommanderService.prototype.addContainer =
// /**
// * the script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id the id the script node will have
// * @param {string} uri the source of the script
// * @param {string} node the node on witch the script will be placed, it can either be head or body
// */
/**
* @param {?} id
* @param {?} uri
* @param {?} node
* @return {?}
*/
function (id, uri, node) {
this._tcContainers.push({ 'id': id, 'uri': uri });
/** @type {?} */
var tagContainer = document.createElement('script');
tagContainer.setAttribute('type', 'text/javascript');
tagContainer.setAttribute('src', uri);
tagContainer.setAttribute('id', id);
if (typeof node !== 'string') {
this.logger.warn('you didn\'t specify where you wanted to place the script, it will be placed in the head by default');
document.querySelector('head').appendChild(tagContainer);
}
else if (node.toLowerCase() === 'head' || node.toLowerCase() === 'body') {
document.querySelector(node.toLowerCase()).appendChild(tagContainer);
}
else {
this.logger.warn('you didn\'t correctily specify where you wanted to place the script, it will be placed in the head by default');
document.querySelector('head').appendChild(tagContainer);
}
};
// /**
// * The script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id
// */
// /**
// * The script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id
// */
/**
* @param {?} id
* @return {?}
*/
TagCommanderService.prototype.removeContainer =
// /**
// * The script URI correspond to the tag-commander script URL, it can either be a CDN URL or the path of your script
// * @param {string} id
// */
/**
* @param {?} id
* @return {?}
*/
function (id) {
/** @type {?} */
var container = document.getElementById(id);
/** @type {?} */
var containers = this._tcContainers.slice(0);
document.querySelector('head').removeChild(container);
for (var i = 0; i < containers.length; i++) {
if (containers[i].id === id) {
this._tcContainers.splice(i, 1);
}
}
};
// /**
// * will display the debug messages if true
// * @param {boolean} debug if set to true it will activate the debug msg default is false
// */
// /**
// * will display the debug messages if true
// * @param {boolean} debug if set to true it will activate the debug msg default is false
// */
/**
* @param {?} debug
* @return {?}
*/
TagCommanderService.prototype.setDebug =
// /**
// * will display the debug messages if true
// * @param {boolean} debug if set to true it will activate the debug msg default is false
// */
/**
* @param {?} debug
* @return {?}
*/
function (debug) {
this.debug = debug;
if (debug) {
this.logger.updateConfig({ level: NgxLoggerLevel.DEBUG });
}
else {
this.logger.updateConfig({ level: NgxLoggerLevel.OFF });
}
};
// /**
// * allows the router to be tracked
// * @param {boolean} b will read routes if set to true
// */
// /**
// * allows the router to be tracked
// * @param {boolean} b will read routes if set to true
// */
/**
* @param {?} b
* @return {?}
*/
TagCommanderService.prototype.trackRoutes =
// /**
// * allows the router to be tracked
// * @param {boolean} b will read routes if set to true
// */
/**
* @param {?} b
* @return {?}
*/
function (b) {
this._trackRoutes = !!b;
};
// /**
// * set or update the value of the var
// * @param {string} tcKey
// * @param {*} tcVar
// */
// /**
// * set or update the value of the var
// * @param {string} tcKey
// * @param {*} tcVar
// */
/**
* @param {?} tcKey
* @param {?} tcVar
* @return {?}
*/
TagCommanderService.prototype.setTcVar =
// /**
// * set or update the value of the var
// * @param {string} tcKey
// * @param {*} tcVar
// */
/**
* @param {?} tcKey
* @param {?} tcVar
* @return {?}
*/
function (tcKey, tcVar) {
if (typeof this.winRef.nativeWindow.tc_vars !== 'undefined') {
this.winRef.nativeWindow.tc_vars[tcKey] = tcVar;
}
};
// /**
// * set your varibles for the different providers, when called the first time it
// * instantiate the external varible
// * @param {object} vars
// */
// /**
// * set your varibles for the different providers, when called the first time it
// * instantiate the external varible
// * @param {object} vars
// */
/**
* @param {?} vars
* @return {?}
*/
TagCommanderService.prototype.setTcVars =
// /**
// * set your varibles for the different providers, when called the first time it
// * instantiate the external varible
// * @param {object} vars
// */
/**
* @param {?} vars
* @return {?}
*/
function (vars) {
this.logger.debug('setTcVars', vars);
/** @type {?} */
var listOfVars = Object.keys(vars);
for (var i = 0; i < listOfVars.length; i++) {
this.setTcVar(listOfVars[i], vars[listOfVars[i]]);
}
};
;
// /**
// * get the value of the var
// * @param {string} tcKey
// */
// /**
// * get the value of the var
// * @param {string} tcKey
// */
/**
* @param {?} tcKey
* @return {?}
*/
TagCommanderService.prototype.getTcVar =
// /**
// * get the value of the var
// * @param {string} tcKey
// */
/**
* @param {?} tcKey
* @return {?}
*/
function (tcKey) {
this.logger.debug('getTcVars', tcKey);
return this.winRef.nativeWindow.tc_vars[tcKey] === null ? this.winRef.nativeWindow.tc_vars[tcKey] : false;
};
;
// /**
// * removes the var by specifying the key
// * @param {string} varKey
// */
// /**
// * removes the var by specifying the key
// * @param {string} varKey
// */
/**
* @param {?} varKey
* @return {?}
*/
TagCommanderService.prototype.removeTcVar =
// /**
// * removes the var by specifying the key
// * @param {string} varKey
// */
/**
* @param {?} varKey
* @return {?}
*/
function (varKey) {
this.logger.debug('removeTcVars', varKey);
delete this.winRef.nativeWindow.tc_vars[varKey];
};
;
// /**
// * will reload all the containers
// * @param {object} options can contain some options in a form of an object
// */
// /**
// * will reload all the containers
// * @param {object} options can contain some options in a form of an object
// */
/**
* @param {?} options
* @return {?}
*/
TagCommanderService.prototype.reloadAllContainers =
// /**
// * will reload all the containers
// * @param {object} options can contain some options in a form of an object
// */
/**
* @param {?} options
* @return {?}
*/
function (options) {
this.logger.debug('reloadAllContainers', options);
options = options || {};
this.logger.debug('Reload all containers ', typeof options === 'object' ? 'with options ' + options : '');
this.winRef.nativeWindow.container.reload(options);
};
;
// /**
// * will reload a specifique container
// * @param {number} ids
// * @param {number} idc
// * @param {object} options can contain some options in a form of an object
// */
// /**
// * will reload a specifique container
// * @param {number} ids
// * @param {number} idc
// * @param {object} options can contain some options in a form of an object
// */
/**
* @param {?} ids
* @param {?} idc
* @param {?} options
* @return {?}
*/
TagCommanderService.prototype.reloadContainer =
// /**
// * will reload a specifique container
// * @param {number} ids
// * @param {number} idc
// * @param {object} options can contain some options in a form of an object
// */
/**
* @param {?} ids
* @param {?} idc
* @param {?} options
* @return {?}
*/
function (ids, idc, options) {
/** @type {?} */
var options = options || {};
this.logger.debug('Reload container ids: ' + ids + ' idc: ' + idc, typeof options === 'object' ? 'with options: ' + options : '');
this.winRef.nativeWindow['container_' + ids + '_' + idc].reload(options);
};
;
// /**
// * will set an TagCommander event
// * @param {string} eventLabel the name of your event
// * @param {HTMLElement} element the HTMLelement on witch the event is attached
// * @param {object} data the data you want to transmit
// */
// /**
// * will set an TagCommander event
// * @param {string} eventLabel the name of your event
// * @param {HTMLElement} element the HTMLelement on witch the event is attached
// * @param {object} data the data you want to transmit
// */
/**
* @param {?} eventLabel
* @param {?} element
* @param {?} data
* @return {?}
*/
TagCommanderService.prototype.captureEvent =
// /**
// * will set an TagCommander event
// * @param {string} eventLabel the name of your event
// * @param {HTMLElement} element the HTMLelement on witch the event is attached
// * @param {object} data the data you want to transmit
// */
/**
* @param {?} eventLabel
* @param {?} element
* @param {?} data
* @return {?}
*/
function (eventLabel, element, data) {
this.logger.debug('captureEvent', eventLabel, element, data);
if (typeof this.winRef.nativeWindow.tC !== 'undefined') {
if (eventLabel in Object.keys(this.winRef.nativeWindow.tC.event)) {
this.winRef.nativeWindow.tC.event[eventLabel](element, data);
}
else {
this.logger.error('the key ' + eventLabel + ' you specified in the catpure event does not existe');
}
}
};
;
TagCommanderService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
TagCommanderService.ctorParameters = function () { return [
{ type: WindowRef },
{ type: CustomNGXLoggerService },
{ type: Router }
]; };
/** @nocollapse */ TagCommanderService.ngInjectableDef = i0.defineInjectable({ factory: function TagCommanderService_Factory() { return new TagCommanderService(i0.inject(i1.WindowRef), i0.inject(i2.CustomNGXLoggerService), i0.inject(i3.Router)); }, token: TagCommanderService, providedIn: "root" });
return TagCommanderService;
}());
export { TagCommanderService };
if (false) {
/** @type {?} */
TagCommanderService.prototype._tcContainers;
/** @type {?} */
TagCommanderService.prototype.pageEvent;
/** @type {?} */
TagCommanderService.prototype.debug;
/** @type {?} */
TagCommanderService.prototype._trackRoutes;
/**
* @type {?}
* @private
*/
TagCommanderService.prototype.logger;
/**
* @type {?}
* @private
*/
TagCommanderService.prototype.winRef;
/**
* @type {?}
* @private
*/
TagCommanderService.prototype.customLogger;
/**
* @type {?}
* @private
*/
TagCommanderService.prototype.router;
/* Skipping unhandled member: ;*/
/* Skipping unhandled member: ;*/
/* Skipping unhandled member: ;*/
/* Skipping unhandled member: ;*/
/* Skipping unhandled member: ;*/
/* Skipping unhandled member: ;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLWNvbW1hbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXRhZy1jb21tYW5kZXIvIiwic291cmNlcyI6WyJsaWIvdGFnLWNvbW1hbmRlci5zZXJ2aWNlL3RhZy1jb21tYW5kZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBYSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDL0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFFM0M7SUFVRSw2QkFBb0IsTUFBaUIsRUFBVSxZQUFvQyxFQUFVLE1BQWM7UUFBM0csaUJBYUM7UUFibUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFOM0csa0JBQWEsR0FBZSxFQUFFLENBQUM7UUFHL0IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFJNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFBLEtBQUs7WUFDaEMsSUFBSSxLQUFLLFlBQVksZ0JBQWdCLElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDMUQsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7O3dCQUN4RCxJQUFJLEdBQWUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFD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QUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDO2dCQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxHQUFHLHFEQUFxRCxDQUFDLENBQUM7YUFDcEc7U0FDRjtJQUNILENBQUM7SUFBQSxDQUFDOztnQkF0S0gsVUFBVSxTQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7OztnQkFMUSxTQUFTO2dCQUZFLHNCQUFzQjtnQkFDakMsTUFBTTs7OzhCQUZmO0NBNktDLEFBdktELElBdUtDO1NBcEtZLG1CQUFtQjs7O0lBQzlCLDRDQUErQjs7SUFDL0Isd0NBQWU7O0lBQ2Ysb0NBQVc7O0lBQ1gsMkNBQThCOzs7OztJQUM5QixxQ0FBMEI7Ozs7O0lBRWQscUNBQXlCOzs7OztJQUFFLDJDQUE0Qzs7Ozs7SUFBRSxxQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvL291ciByb290IGFwcCBjb21wb25lbnRcclxuaW1wb3J0IHsgTkdYTG9nZ2VyLCBDdXN0b21OR1hMb2dnZXJTZXJ2aWNlLCBOZ3hMb2dnZXJMZXZlbCB9IGZyb20gJ25neC1sb2dnZXInO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlc1JlY29nbml6ZWQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICcuL1dpbmRvd1JlZic7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhZ0NvbW1hbmRlclNlcnZpY2Uge1xyXG4gIF90Y0NvbnRhaW5lcnM6IEFycmF5PGFueT4gPSBbXTtcclxuICBwYWdlRXZlbnQ6IGFueTtcclxuICBkZWJ1ZzogYW55O1xyXG4gIF90cmFja1JvdXRlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2luUmVmOiBXaW5kb3dSZWYsIHByaXZhdGUgY3VzdG9tTG9nZ2VyOiBDdXN0b21OR1hMb2dnZXJTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XHJcbiAgICB0aGlzLmxvZ2dlciA9IGN1c3RvbUxvZ2dlci5jcmVhdGUoe2xldmVsOiBOZ3hMb2dnZXJMZXZlbC5ERUJVR30pO1xyXG4gICAgXHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKF9kYXRhID0+IHtcclxuICAgICAgaWYgKF9kYXRhIGluc3RhbmNlb2YgUm91dGVzUmVjb2duaXplZCAmJiB0aGlzLl90cmFja1JvdXRlcykge1xyXG4gICAgICAgIGlmIChfZGF0YS5zdGF0ZS5yb290LmZpcnN0Q2hpbGQuZGF0YS50Y0luY2x1ZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGRhdGE6IEFycmF5PGFueT4gPSBfZGF0YS5zdGF0ZS5yb290LmZpcnN0Q2hpbGQuZGF0YS50Y0luY2x1ZGU7XHJcbiAgICAgICAgICBkYXRhLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRDb250YWluZXIoY29udGFpbmVyWydpZHMnXSwgY29udGFpbmVyWydpZGMnXSwgY29udGFpbmVyWydvcHRpb25zJ10pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIHRoZSBzY3JpcHQgVVJJIGNvcnJlc3BvbmQgdG8gdGhlIHRhZy1jb21tYW5kZXIgc2NyaXB0IFVSTCwgaXQgY2FuIGVpdGhlciBiZSBhIENETiBVUkwgb3IgdGhlIHBhdGggb2YgeW91ciBzY3JpcHRcclxuICAvLyAgKiBAcGFyYW0ge3N0cmluZ30gaWQgdGhlIGlkIHRoZSBzY3JpcHQgbm9kZSB3aWxsIGhhdmVcclxuICAvLyAgKiBAcGFyYW0ge3N0cmluZ30gdXJpIHRoZSBzb3VyY2Ugb2YgdGhlIHNjcmlwdFxyXG4gIC8vICAqIEBwYXJhbSB7c3RyaW5nfSBub2RlIHRoZSBub2RlIG9uIHdpdGNoIHRoZSBzY3JpcHQgd2lsbCBiZSBwbGFjZWQsIGl0IGNhbiBlaXRoZXIgYmUgaGVhZCBvciBib2R5XHJcbiAgLy8gKi9cclxuICBhZGRDb250YWluZXIoaWQ6c3RyaW5nLCB1cmk6c3RyaW5nLCBub2RlOnN0cmluZyk6dm9pZCB7XHJcbiAgICB0aGlzLl90Y0NvbnRhaW5lcnMucHVzaCh7ICdpZCc6IGlkLCAndXJpJzogdXJpIH0pO1xyXG4gICAgbGV0IHRhZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgdGFnQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcclxuICAgIHRhZ0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVyaSk7XHJcbiAgICB0YWdDb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcclxuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5sb2dnZXIud2FybigneW91IGRpZG5cXCd0IHNwZWNpZnkgd2hlcmUgeW91IHdhbnRlZCB0byBwbGFjZSB0aGUgc2NyaXB0LCBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgaGVhZCBieSBkZWZhdWx0Jyk7XHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5hcHBlbmRDaGlsZCh0YWdDb250YWluZXIpO1xyXG4gICAgfSBlbHNlIGlmIChub2RlLnRvTG93ZXJDYXNlKCkgPT09ICdoZWFkJyB8fCBub2RlLnRvTG93ZXJDYXNlKCkgPT09ICdib2R5Jykge1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vZGUudG9Mb3dlckNhc2UoKSkuYXBwZW5kQ2hpbGQodGFnQ29udGFpbmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ3lvdSBkaWRuXFwndCBjb3JyZWN0aWx5IHNwZWNpZnkgd2hlcmUgeW91IHdhbnRlZCB0byBwbGFjZSB0aGUgc2NyaXB0LCBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgaGVhZCBieSBkZWZhdWx0Jyk7XHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5hcHBlbmRDaGlsZCh0YWdDb250YWluZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICogVGhlIHNjcmlwdCBVUkkgY29ycmVzcG9uZCB0byB0aGUgdGFnLWNvbW1hbmRlciBzY3JpcHQgVVJMLCBpdCBjYW4gZWl0aGVyIGJlIGEgQ0ROIFVSTCBvciB0aGUgcGF0aCBvZiB5b3VyIHNjcmlwdFxyXG4gIC8vICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxyXG4gIC8vICAqL1xyXG4gIHJlbW92ZUNvbnRhaW5lcihpZDpzdHJpbmcpOnZvaWQge1xyXG4gICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGxldCBjb250YWluZXJzID0gdGhpcy5fdGNDb250YWluZXJzLnNsaWNlKDApO1xyXG5cclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoY29udGFpbmVyc1tpXS5pZCA9PT0gaWQpIHtcclxuICAgICAgICB0aGlzLl90Y0NvbnRhaW5lcnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiB3aWxsIGRpc3BsYXkgdGhlIGRlYnVnIG1lc3NhZ2VzIGlmIHRydWVcclxuICAvLyAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlYnVnIGlmIHNldCB0byB0cnVlIGl0IHdpbGwgYWN0aXZhdGUgdGhlIGRlYnVnIG1zZyBkZWZhdWx0IGlzIGZhbHNlXHJcbiAgLy8gICovXHJcbiAgc2V0RGVidWcoZGVidWc6Ym9vbGVhbik6dm9pZCB7XHJcbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XHJcbiAgICBpZiAoZGVidWcpIHtcclxuICAgICAgdGhpcy5sb2dnZXIudXBkYXRlQ29uZmlnKHtsZXZlbDogTmd4TG9nZ2VyTGV2ZWwuREVCVUd9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLnVwZGF0ZUNvbmZpZyh7bGV2ZWw6IE5neExvZ2dlckxldmVsLk9GRn0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICogYWxsb3dzIHRoZSByb3V0ZXIgdG8gYmUgdHJhY2tlZFxyXG4gIC8vICAqIEBwYXJhbSB7Ym9vbGVhbn0gYiB3aWxsIHJlYWQgcm91dGVzIGlmIHNldCB0byB0cnVlXHJcbiAgLy8gICovXHJcbiAgdHJhY2tSb3V0ZXMoYjpib29sZWFuKTp2b2lkIHtcclxuICAgIHRoaXMuX3RyYWNrUm91dGVzID0gISFiO1xyXG4gIH1cclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICogc2V0IG9yIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHZhclxyXG4gIC8vICAqIEBwYXJhbSB7c3RyaW5nfSB0Y0tleVxyXG4gIC8vICAqIEBwYXJhbSB7Kn0gdGNWYXJcclxuICAvLyAgKi9cclxuICBzZXRUY1Zhcih0Y0tleTpzdHJpbmcsIHRjVmFyOmFueSk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3cudGNfdmFycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy53aW5SZWYubmF0aXZlV2luZG93LnRjX3ZhcnNbdGNLZXldID0gdGNWYXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBzZXQgeW91ciB2YXJpYmxlcyBmb3IgdGhlIGRpZmZlcmVudCBwcm92aWRlcnMsIHdoZW4gY2FsbGVkIHRoZSBmaXJzdCB0aW1lIGl0XHJcbiAgLy8gICogaW5zdGFudGlhdGUgdGhlIGV4dGVybmFsIHZhcmlibGVcclxuICAvLyAgKiBAcGFyYW0ge29iamVjdH0gdmFyc1xyXG4gIC8vICAqL1xyXG4gIHNldFRjVmFycyh2YXJzOm9iamVjdCk6dm9pZCB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2V0VGNWYXJzJywgdmFycyk7XHJcbiAgICBsZXQgbGlzdE9mVmFycyA9IE9iamVjdC5rZXlzKHZhcnMpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0T2ZWYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2V0VGNWYXIobGlzdE9mVmFyc1tpXSwgdmFyc1tsaXN0T2ZWYXJzW2ldXSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICogZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgdmFyXHJcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IHRjS2V5XHJcbiAgLy8gICovXHJcbiAgZ2V0VGNWYXIodGNLZXk6c3RyaW5nKTphbnkge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ2dldFRjVmFycycsIHRjS2V5KTtcclxuICAgIHJldHVybiB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3cudGNfdmFyc1t0Y0tleV0gPT09IG51bGwgPyB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3cudGNfdmFyc1t0Y0tleV0gOiBmYWxzZTtcclxuICB9O1xyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiByZW1vdmVzIHRoZSB2YXIgYnkgc3BlY2lmeWluZyB0aGUga2V5XHJcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IHZhcktleVxyXG4gIC8vICAqL1xyXG4gIHJlbW92ZVRjVmFyKHZhcktleTpzdHJpbmcpOnZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ3JlbW92ZVRjVmFycycsIHZhcktleSk7XHJcbiAgICBkZWxldGUgdGhpcy53aW5SZWYubmF0aXZlV2luZG93LnRjX3ZhcnNbdmFyS2V5XTtcclxuICB9O1xyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiB3aWxsIHJlbG9hZCBhbGwgdGhlIGNvbnRhaW5lcnNcclxuICAvLyAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBjYW4gY29udGFpbiBzb21lIG9wdGlvbnMgaW4gYSBmb3JtIG9mIGFuIG9iamVjdFxyXG4gIC8vICAqL1xyXG4gIHJlbG9hZEFsbENvbnRhaW5lcnMob3B0aW9uczpvYmplY3QpOnZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ3JlbG9hZEFsbENvbnRhaW5lcnMnLCBvcHRpb25zKTtcclxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1JlbG9hZCBhbGwgY29udGFpbmVycyAnLCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgPyAnd2l0aCBvcHRpb25zICcgKyBvcHRpb25zIDogJycpO1xyXG4gICAgdGhpcy53aW5SZWYubmF0aXZlV2luZG93LmNvbnRhaW5lci5yZWxvYWQob3B0aW9ucyk7XHJcbiAgfTtcclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICogd2lsbCByZWxvYWQgYSBzcGVjaWZpcXVlIGNvbnRhaW5lclxyXG4gIC8vICAqIEBwYXJhbSB7bnVtYmVyfSBpZHNcclxuICAvLyAgKiBAcGFyYW0ge251bWJlcn0gaWRjXHJcbiAgLy8gICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgY2FuIGNvbnRhaW4gc29tZSBvcHRpb25zIGluIGEgZm9ybSBvZiBhbiBvYmplY3RcclxuICAvLyAgKi9cclxuICByZWxvYWRDb250YWluZXIoaWRzOnN0cmluZywgaWRjOnN0cmluZywgb3B0aW9uczpvYmplY3QpOnZvaWQge1xyXG4gICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1JlbG9hZCBjb250YWluZXIgaWRzOiAnICsgaWRzICsgJyBpZGM6ICcgKyBpZGMsIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/ICd3aXRoIG9wdGlvbnM6ICcgKyBvcHRpb25zIDogJycpO1xyXG4gICAgdGhpcy53aW5SZWYubmF0aXZlV2luZG93Wydjb250YWluZXJfJyArIGlkcyArICdfJyArIGlkY10ucmVsb2FkKG9wdGlvbnMpO1xyXG4gIH07XHJcblxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIHdpbGwgc2V0IGFuIFRhZ0NvbW1hbmRlciBldmVudFxyXG4gIC8vICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudExhYmVsIHRoZSBuYW1lIG9mIHlvdXIgZXZlbnRcclxuICAvLyAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IHRoZSBIVE1MZWxlbWVudCBvbiB3aXRjaCB0aGUgZXZlbnQgaXMgYXR0YWNoZWRcclxuICAvLyAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSB0aGUgZGF0YSB5b3Ugd2FudCB0byB0cmFuc21pdFxyXG4gIC8vICAqL1xyXG4gIGNhcHR1cmVFdmVudChldmVudExhYmVsOnN0cmluZywgZWxlbWVudDphbnksIGRhdGE6b2JqZWN0KTp2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdjYXB0dXJlRXZlbnQnLCBldmVudExhYmVsLCBlbGVtZW50LCBkYXRhKTtcclxuICAgIGlmICh0eXBlb2YgdGhpcy53aW5SZWYubmF0aXZlV2luZG93LnRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAoZXZlbnRMYWJlbCBpbiBPYmplY3Qua2V5cyh0aGlzLndpblJlZi5uYXRpdmVXaW5kb3cudEMuZXZlbnQpKXtcclxuICAgICAgICB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3cudEMuZXZlbnRbZXZlbnRMYWJlbF0oZWxlbWVudCwgZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ3RoZSBrZXkgJyArIGV2ZW50TGFiZWwgKyAnIHlvdSBzcGVjaWZpZWQgaW4gdGhlIGNhdHB1cmUgZXZlbnQgZG9lcyBub3QgZXhpc3RlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG59XHJcbiJdfQ==