UNPKG

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
/** * @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==