ng-ptplibraries
Version:
262 lines (261 loc) • 22.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ServiceBase } from '../base/service.base';
import { Observable } from 'rxjs';
import { ScriptModel, StyleModel } from '../models/loader';
import { map, has } from 'lodash';
var LoaderService = /** @class */ (function (_super) {
tslib_1.__extends(LoaderService, _super);
function LoaderService() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.scripts = [];
_this.styles = [];
_this.scriptIndex = 0;
return _this;
}
/**
* @param {?} scriptModel
* @return {?}
*/
LoaderService.prototype.CreateScriptElement = /**
* @param {?} scriptModel
* @return {?}
*/
function (scriptModel) {
/** @type {?} */
var scriptElement = document.createElement('script');
scriptElement.type = 'text/javascript';
scriptElement.src = scriptModel.src;
scriptElement.integrity = scriptModel.integrity;
scriptElement.crossOrigin = scriptModel.crossorigin;
return scriptElement;
};
/**
* @param {?} styleModel
* @return {?}
*/
LoaderService.prototype.CreateStyleElement = /**
* @param {?} styleModel
* @return {?}
*/
function (styleModel) {
/** @type {?} */
var styleElement = document.createElement('link');
styleElement.href = styleModel.href;
styleElement.rel = styleModel.rel;
styleElement.integrity = styleModel.integrity;
styleElement['crossorigin'] = styleModel.crossorigin;
return styleElement;
};
/**
* Waits for script to finish before loading the next script
* @param {?} observer
* @return {?}
*/
LoaderService.prototype.SyncLoad = /**
* Waits for script to finish before loading the next script
* @param {?} observer
* @return {?}
*/
function (observer) {
var _this = this;
/** @type {?} */
var script = null;
if (this.scriptIndex < this.scripts.length) {
script = this.scripts[this.scriptIndex];
}
if (this.scripts.every(function (a) { return a.loaded === true; })) {
/** @type {?} */
var ret = this.scripts.map(function (d) { return d.Deserialize(); });
observer.next(/** @type {?} */ (ret));
observer.complete();
}
else {
/** @type {?} */
var scriptElement = this.CreateScriptElement(script);
scriptElement.onload = function () {
script.loaded = true;
if (_this.scriptIndex < _this.scripts.length)
_this.scriptIndex++;
_this.SyncLoad(observer);
};
scriptElement.onerror = function (error) {
observer.error('Couldn\'t load script ' + script.src);
};
document.getElementsByTagName('body')[0].appendChild(scriptElement);
}
};
/**
* Loads an external script from a url synchronously.
* @param loader
* @example
*
*loader.LoadScript([
{
source: 'https://test.com/test.min.js',
integrity: 'fdsafdsar32qxr3q2'
}
*]).subscribe();
* */
/**
* Loads an external script from a url synchronously.
* \@example
*
* loader.LoadScript([
* {
* source: 'https://test.com/test.min.js',
* integrity: 'fdsafdsar32qxr3q2'
* }
* ]).subscribe();
*
* @param {?} loader
* @param {...?} pussy
* @return {?}
*/
LoaderService.prototype.LoadScript = /**
* Loads an external script from a url synchronously.
* \@example
*
* loader.LoadScript([
* {
* source: 'https://test.com/test.min.js',
* integrity: 'fdsafdsar32qxr3q2'
* }
* ]).subscribe();
*
* @param {?} loader
* @param {...?} pussy
* @return {?}
*/
function (loader) {
var _this = this;
var pussy = [];
for (var _i = 1; _i < arguments.length; _i++) {
pussy[_i - 1] = arguments[_i];
}
return new Observable(function (observer) {
/** @type {?} */
var scriptSrcs = _this.scripts.map(function (a) { return a.src; });
// Push to scripts array if source does not exist
for (var i = 0; i < loader.length; i++) {
/** @type {?} */
var newScript = new ScriptModel();
newScript.src = loader[i].source;
newScript.integrity = loader[i].integrity || '';
if (!has(scriptSrcs, newScript.src)) {
_this.scripts.push(newScript);
}
if (!_this.scripts.length) {
_this.scripts.push(newScript);
}
scriptSrcs = _this.scripts.map(function (a) { return a.src; });
}
_this.SyncLoad(observer);
});
};
/**
* Loads an external stylesheet from a url
* @param loader
* @example
*
*loader.LoadScript([
{
source: 'https://test.com/test.min.js',
integrity: 'fdsafdsar32qxr3q2'
}
*]).subscribe();
* */
/**
* Loads an external stylesheet from a url
* \@example
*
* loader.LoadScript([
* {
* source: 'https://test.com/test.min.js',
* integrity: 'fdsafdsar32qxr3q2'
* }
* ]).subscribe();
*
* @param {?} loader
* @return {?}
*/
LoaderService.prototype.LoadStyle = /**
* Loads an external stylesheet from a url
* \@example
*
* loader.LoadScript([
* {
* source: 'https://test.com/test.min.js',
* integrity: 'fdsafdsar32qxr3q2'
* }
* ]).subscribe();
*
* @param {?} loader
* @return {?}
*/
function (loader) {
var _this = this;
return new Observable(function (observer) {
/** @type {?} */
var styleHrefs = _this.styles.map(function (a) { return a.href; });
// Push to scripts array if source does not exist
for (var i = 0; i < loader.length; i++) {
/** @type {?} */
var newStyle = new StyleModel();
newStyle.href = loader[i].href;
newStyle.integrity = loader[i].integrity || '';
if (!has(styleHrefs, newStyle.href)) {
_this.styles.push(newStyle);
}
if (!_this.styles.length) {
_this.styles.push(newStyle);
}
styleHrefs = _this.styles.map(function (a) { return a.href; });
}
map(_this.styles, function (style) {
// Complete if already loaded
if (style.loaded) {
/** @type {?} */
var ret = _this.styles.map(function (d) { return d.Deserialize(); });
observer.next(/** @type {?} */ (ret));
observer.complete();
}
else {
/** @type {?} */
var scriptElement = _this.CreateStyleElement(style);
scriptElement.onload = function () {
style.loaded = true;
if (_this.styles.every(function (a) { return a.loaded === true; })) {
/** @type {?} */
var ret = _this.styles.map(function (d) { return d.Deserialize(); });
observer.next(/** @type {?} */ (ret));
observer.complete();
}
};
scriptElement.onerror = function (error) {
observer.error('Couldn\'t load style ' + style.href);
};
/** @type {?} */
var head = document.getElementsByTagName('head')[0];
/** @type {?} */
var styleTag = head.getElementsByTagName('style')[0];
head.insertBefore(scriptElement, styleTag);
}
});
});
};
return LoaderService;
}(ServiceBase));
export { LoaderService };
if (false) {
/** @type {?} */
LoaderService.prototype.scripts;
/** @type {?} */
LoaderService.prototype.styles;
/** @type {?} */
LoaderService.prototype.scriptIndex;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1wdHBsaWJyYXJpZXMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBZSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWxDLElBQUE7SUFBbUMseUNBQVc7Ozt3QkFFVCxFQUFFO3VCQUNKLEVBQUU7NEJBQ0gsQ0FBQzs7Ozs7OztJQUV2QiwyQ0FBbUI7Ozs7Y0FBQyxXQUF3Qjs7UUFDaEQsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxhQUFhLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO1FBQ3ZDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxhQUFhLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDaEQsYUFBYSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQ3BELE9BQU8sYUFBYSxDQUFDOzs7Ozs7SUFHakIsMENBQWtCOzs7O2NBQUMsVUFBc0I7O1FBQzdDLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsWUFBWSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3BDLFlBQVksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxZQUFZLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxT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R0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hELENBQUM7O29CQUVGLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3BELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQzlDO2FBQ0osQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0tBQ047d0JBbktMO0VBTW1DLFdBQVcsRUErSjdDLENBQUE7QUEvSkQseUJBK0pDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4uL2Jhc2Uvc2VydmljZS5iYXNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTY3JpcHRNb2RlbCwgU3R5bGVNb2RlbCwgTG9hZGVyTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvbG9hZGVyJztcbmltcG9ydCB7IG1hcCwgaGFzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIExvYWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlQmFzZSB7XG5cbiAgICBwcml2YXRlIHNjcmlwdHM6IFNjcmlwdE1vZGVsW10gPSBbXTtcbiAgICBwcml2YXRlIHN0eWxlczogU3R5bGVNb2RlbFtdID0gW107XG4gICAgcHJpdmF0ZSBzY3JpcHRJbmRleDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgQ3JlYXRlU2NyaXB0RWxlbWVudChzY3JpcHRNb2RlbDogU2NyaXB0TW9kZWwpIHtcbiAgICAgICAgbGV0IHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gc2NyaXB0TW9kZWwuc3JjO1xuICAgICAgICBzY3JpcHRFbGVtZW50LmludGVncml0eSA9IHNjcmlwdE1vZGVsLmludGVncml0eTtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5jcm9zc09yaWdpbiA9IHNjcmlwdE1vZGVsLmNyb3Nzb3JpZ2luO1xuICAgICAgICByZXR1cm4gc2NyaXB0RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIENyZWF0ZVN0eWxlRWxlbWVudChzdHlsZU1vZGVsOiBTdHlsZU1vZGVsKSB7XG4gICAgICAgIGxldCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlRWxlbWVudC5ocmVmID0gc3R5bGVNb2RlbC5ocmVmO1xuICAgICAgICBzdHlsZUVsZW1lbnQucmVsID0gc3R5bGVNb2RlbC5yZWw7XG4gICAgICAgIHN0eWxlRWxlbWVudC5pbnRlZ3JpdHkgPSBzdHlsZU1vZGVsLmludGVncml0eTtcbiAgICAgICAgc3R5bGVFbGVtZW50Wydjcm9zc29yaWdpbiddID0gc3R5bGVNb2RlbC5jcm9zc29yaWdpbjtcbiAgICAgICAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYWl0cyBmb3Igc2NyaXB0IHRvIGZpbmlzaCBiZWZvcmUgbG9hZGluZyB0aGUgbmV4dCBzY3JpcHRcbiAgICAgKi9cbiAgICBwcml2YXRlIFN5bmNMb2FkKG9ic2VydmVyOiBPYnNlcnZlcjxTY3JpcHRNb2RlbFtdPikge1xuICAgICAgICBsZXQgc2NyaXB0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zY3JpcHRJbmRleCA8IHRoaXMuc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNjcmlwdCA9IHRoaXMuc2NyaXB0c1t0aGlzLnNjcmlwdEluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjcmlwdHMuZXZlcnkoYSA9PiBhLmxvYWRlZCA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnNjcmlwdHMubWFwKGQgPT4gZC5EZXNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoPGFueT5yZXQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzY3JpcHRFbGVtZW50ID0gdGhpcy5DcmVhdGVTY3JpcHRFbGVtZW50KHNjcmlwdCk7XG5cbiAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NyaXB0SW5kZXggPCB0aGlzLnNjcmlwdHMubGVuZ3RoKSB0aGlzLnNjcmlwdEluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICB0aGlzLlN5bmNMb2FkKG9ic2VydmVyKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ0NvdWxkblxcJ3QgbG9hZCBzY3JpcHQgJyArIHNjcmlwdC5zcmMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChzY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuIGV4dGVybmFsIHNjcmlwdCBmcm9tIGEgdXJsIHN5bmNocm9ub3VzbHkuXG4gICAgICogQHBhcmFtIGxvYWRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKmxvYWRlci5Mb2FkU2NyaXB0KFtcbiAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly90ZXN0LmNvbS90ZXN0Lm1pbi5qcycsXG4gICAgICAgICAgICBpbnRlZ3JpdHk6ICdmZHNhZmRzYXIzMnF4cjNxMidcbiAgICAgICAgfVxuICAgICAqXSkuc3Vic2NyaWJlKCk7XG4gICAgICogKi9cbiAgICBMb2FkU2NyaXB0KGxvYWRlcjogTG9hZGVyTW9kZWxbXSwgLi4ucHVzc3k6IExvYWRlck1vZGVsW10pOiBPYnNlcnZhYmxlPFNjcmlwdE1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFNjcmlwdE1vZGVsW10+KChvYnNlcnZlcjogT2JzZXJ2ZXI8U2NyaXB0TW9kZWxbXT4pID0+IHtcbiAgICAgICAgICAgIGxldCBzY3JpcHRTcmNzID0gdGhpcy5zY3JpcHRzLm1hcChhID0+IGEuc3JjKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0byBzY3JpcHRzIGFycmF5IGlmIHNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U2NyaXB0OiBTY3JpcHRNb2RlbCA9IG5ldyBTY3JpcHRNb2RlbCgpO1xuICAgICAgICAgICAgICAgIG5ld1NjcmlwdC5zcmMgPSBsb2FkZXJbaV0uc291cmNlO1xuICAgICAgICAgICAgICAgIG5ld1NjcmlwdC5pbnRlZ3JpdHkgPSBsb2FkZXJbaV0uaW50ZWdyaXR5IHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXMoc2NyaXB0U3JjcywgbmV3U2NyaXB0LnNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzLnB1c2gobmV3U2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzLnB1c2gobmV3U2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHRTcmNzID0gdGhpcy5zY3JpcHRzLm1hcChhID0+IGEuc3JjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5TeW5jTG9hZChvYnNlcnZlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuIGV4dGVybmFsIHN0eWxlc2hlZXQgZnJvbSBhIHVybFxuICAgICAqIEBwYXJhbSBsb2FkZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICpsb2FkZXIuTG9hZFNjcmlwdChbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vdGVzdC5jb20vdGVzdC5taW4uanMnLFxuICAgICAgICAgICAgaW50ZWdyaXR5OiAnZmRzYWZkc2FyMzJxeHIzcTInXG4gICAgICAgIH1cbiAgICAgKl0pLnN1YnNjcmliZSgpO1xuICAgICAqICovXG4gICAgTG9hZFN0eWxlKGxvYWRlcjogTG9hZGVyTW9kZWxbXSk6IE9ic2VydmFibGU8U3R5bGVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8U3R5bGVNb2RlbD4oKG9ic2VydmVyOiBPYnNlcnZlcjxTdHlsZU1vZGVsPikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlSHJlZnMgPSB0aGlzLnN0eWxlcy5tYXAoYSA9PiBhLmhyZWYpO1xuICAgICAgICAgICAgLy8gUHVzaCB0byBzY3JpcHRzIGFycmF5IGlmIHNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3R5bGU6IFN0eWxlTW9kZWwgPSBuZXcgU3R5bGVNb2RlbCgpO1xuICAgICAgICAgICAgICAgIG5ld1N0eWxlLmhyZWYgPSBsb2FkZXJbaV0uaHJlZjtcbiAgICAgICAgICAgICAgICBuZXdTdHlsZS5pbnRlZ3JpdHkgPSBsb2FkZXJbaV0uaW50ZWdyaXR5IHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXMoc3R5bGVIcmVmcywgbmV3U3R5bGUuaHJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaChuZXdTdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaChuZXdTdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3R5bGVIcmVmcyA9IHRoaXMuc3R5bGVzLm1hcChhID0+IGEuaHJlZik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hcCh0aGlzLnN0eWxlcywgc3R5bGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5zdHlsZXMubWFwKGQgPT4gZC5EZXNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCg8YW55PnJldCk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZSBhbmQgbG9hZCBpdCBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2NyaXB0RWxlbWVudCA9IHRoaXMuQ3JlYXRlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlcy5ldmVyeShhID0+IGEubG9hZGVkID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnN0eWxlcy5tYXAoZCA9PiBkLkRlc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoPGFueT5yZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWxlbWVudC5vbmVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdDb3VsZG5cXCd0IGxvYWQgc3R5bGUgJyArIHN0eWxlLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlVGFnID0gaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3R5bGUnKVswXTtcblxuICAgICAgICAgICAgICAgICAgICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHRFbGVtZW50LCBzdHlsZVRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19