Repository URL to install this package:
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @record
*/
export function ThemeItem() { }
if (false) {
/** @type {?} */
ThemeItem.prototype.description;
}
export class ThemeGroup {
}
if (false) {
/** @type {?} */
ThemeGroup.prototype.items;
/** @type {?} */
ThemeGroup.prototype.description;
}
/**
* @abstract
*/
export class ThemeModel extends ThemeGroup {
}
if (false) {
/** @type {?} */
ThemeModel.prototype.description;
/**
* @abstract
* @return {?}
*/
ThemeModel.prototype.exportTheme = function () { };
}
/** @type {?} */
const LOG_TAG = '[DefaultThemeModel]';
export class ThemeColorItem {
/**
* @param {?} name
* @param {?} description
* @param {?} cssPropertyName
* @param {?} scssVariableName
* @param {?} themeWrapper
* @param {?} logger
*/
constructor(name, description, cssPropertyName, scssVariableName, themeWrapper, logger) {
this.name = name;
this.description = description;
this.cssPropertyName = cssPropertyName;
this.scssVariableName = scssVariableName;
this.themeWrapper = themeWrapper;
this.logger = logger;
this.presets = ['#00000000'];
this._value = this.getColorProperty(cssPropertyName);
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @param {?} colorValue
* @return {?}
*/
set value(colorValue) {
this._value = colorValue;
this.themeWrapper.style.setProperty(this.cssPropertyName, colorValue);
//console.log(">>>>> Set color value: ", colorValue);
}
/**
* @private
* @param {?} variableName
* @return {?}
*/
getColorProperty(variableName) {
/** @type {?} */
var style = getComputedStyle(this.themeWrapper);
/** @type {?} */
var ret = style.getPropertyValue(variableName).trim();
return ret;
}
}
if (false) {
/**
* @type {?}
* @private
*/
ThemeColorItem.prototype._value;
/** @type {?} */
ThemeColorItem.prototype.presets;
/** @type {?} */
ThemeColorItem.prototype.name;
/** @type {?} */
ThemeColorItem.prototype.description;
/** @type {?} */
ThemeColorItem.prototype.cssPropertyName;
/** @type {?} */
ThemeColorItem.prototype.scssVariableName;
/**
* @type {?}
* @private
*/
ThemeColorItem.prototype.themeWrapper;
/**
* @type {?}
* @private
*/
ThemeColorItem.prototype.logger;
}
export class DefaultThemeModel {
/**
* @param {?} logger
* @param {?} document
*/
constructor(logger, document) {
this.logger = logger;
this.document = document;
this.items = [];
this.logger.debug(LOG_TAG, 'Initializing');
this.themeWrapper = this.document.querySelector('app-root');
this.createModel();
}
/**
* @private
* @return {?}
*/
createModel() {
this.items.push(this.createMainGroup());
this.items.push(this.createToolbarGroup());
this.items.push(this.createHeaderGroup());
this.items.push(this.createFooterGroup());
this.items.push(this.createGridGroup());
this.items.push(this.createTabsGroup());
this.items.push(this.createButtonsGroup());
this.items.push(this.createComboboxGroup());
this.items.push(this.createInputGroup());
}
/**
* @private
* @return {?}
*/
createMainGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Main";
ret.items = [
// Main Colors
this.createColorItem('background', 'Main Background', '--main-background-color', '$main_background_color'),
//Titles
this.createColorItem('background', 'Title 1 Color', '--title-1-color', '$title1_color'),
];
return ret;
}
/**
* @private
* @return {?}
*/
createHeaderGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Header";
ret.items = [
// Header Colors
this.createColorItem('header', 'Header Background', '--header-background-color', '$header_background_color'),
this.createColorItem('header', 'Header Color', '--header-color', '$header_description_color'),
this.createColorItem('header', 'Header Hover', '--header-color-hover', '$header_description_hover_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createFooterGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Footer";
ret.items = [
// Footer Colors
this.createColorItem('footer', 'Footer Background', '--footer-background-color', '$footer_background_color'),
this.createColorItem('footer', 'Footer Color', '--footer-color', '$footer_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createGridGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Grid";
ret.items = [
// Grid Colors
this.createColorItem('grid', 'Grid Background', '--grid-background-color', '$grid_background_color'),
this.createColorItem('grid', 'Grid Color', '--grid-color', '$grid_color'),
this.createColorItem('grid', 'Grid Border Color', '--grid-border-color', '$grid_border_color'),
this.createColorItem('grid', 'Grid Header Color', '--grid-header-color', '$grid_header_color'),
this.createColorItem('grid', 'Grid Header Border', '--grid-header-border-color', '$grid_header_border_color'),
this.createColorItem('grid', 'Grid Hover Backgorund', '--grid-row-hover-background-color', '$grid_tr_hover_background_color'),
this.createColorItem('grid', 'Grid Hover Color', '--grid-row-hover-color', '$grid_tr_hover_color'),
this.createColorItem('grid', 'Grid Selected Background Color', '--grid-row-selected-background-color', '$grid_selected_row_color'),
this.createColorItem('grid', 'Grid Selected Color', '--grid-row-selected-color', '$grid_selected_row'),
this.createColorItem('grid', 'Grid Command Color', '--grid-command-color', '$grid_command_color'),
this.createColorItem('grid', 'Grid Selected Row Command Color', '--grid-selected-row-command-color', '$grid_selected_row_command_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createToolbarGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Main Toolbar";
ret.items = [
// Toolbar Colors
this.createColorItem('mainToolbar', 'Background', '--nav-background-color', '$nav_background_color'),
this.createColorItem('mainToolbar', 'Border', '--nav-border-color', '$nav_a_a_border_color'),
this.createColorItem('mainToolbar', 'Color', '--nav-color', '$nav_color'),
this.createColorItem('mainToolbar', 'Background Hover', '--nav-hover-background-color', '$nav_hover_background_color'),
this.createColorItem('mainToolbar', 'Color Hover', '--nav-hover-color', '$nav_hover_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createTabsGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Tabs";
ret.items = [
// Toolbar Colors
this.createColorItem('tabs', 'Background', '--tab-background-color', '$tab_background_color'),
this.createColorItem('tabs', 'Color', '--tab-color', '$tab_color'),
this.createColorItem('tabs', 'Selected Background', '--tab-selected-background-color', '$tab_selected_background_color'),
this.createColorItem('tabs', 'Selected Color', '--tab-selected-color', '$tab_selected_color'),
];
return ret;
}
/**
* @private
* @return {?}
*/
createButtonsGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Buttons";
ret.items = [
// Toolbar Colors
this.createColorItem('buttons', 'Background', '--button-background-color', '$button_background_color'),
this.createColorItem('buttons', 'Color', '--button-color', '$button_color'),
this.createColorItem('buttons', 'Border', '--button-border-color', '$button_border_color'),
this.createColorItem('buttons', 'Hover Background', '--button-hover-background-color', '$button_hover_background_color'),
this.createColorItem('buttons', 'Hover Color', '--button-hover-color', '$button_hover_color'),
this.createColorItem('buttons', 'Hover Border', '--button-hover-border-color', '$button_hover_border_color'),
this.createColorItem('buttons', 'Disabled Background', '--button-disabled-background-color', '$button_disabled_background_color'),
this.createColorItem('buttons', 'Disabled Color', '--button-disabled-color', '$button_disabled_color'),
this.createColorItem('buttons', 'Disabled Border', '--button-disabled-border-color', '$button_disabled_border_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createComboboxGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Comboboxes";
ret.items = [
// Toolbar Colors
this.createColorItem('combobox', 'Background', '--combobox-background-color', '$combobox_background_color'),
this.createColorItem('combobox', 'Color', '--combobox-color', '$combobox_color'),
this.createColorItem('combobox', 'Selection Background', '--combobox-selected-item-background-color', '$combobox_selected_item_background_color'),
this.createColorItem('combobox', 'Selection Color', '--combobox-selected-item-color', '$combobox_selected_item_color'),
this.createColorItem('combobox', 'Button Background', '--combobox-button-background-color', '$combobox_button_background_color'),
this.createColorItem('combobox', 'Button Color', '--combobox-button-color', '$combobox_button_color')
];
return ret;
}
/**
* @private
* @return {?}
*/
createInputGroup() {
/** @type {?} */
let ret = new ThemeGroup();
ret.description = "Input";
ret.items = [
// Toolbar Colors
this.createColorItem('input', 'Background', '--input-background-color', '$input_background_color'),
this.createColorItem('input', 'Color', '--input-color', '$input_color'),
this.createColorItem('input', 'Placeholder Color', '--input-placeholder-color', '$input_placeholder_color'),
this.createColorItem('input', 'Border Color', '--input-border-color', '$input_border_color'),
this.createColorItem('input', 'Focus Background', '--input-focus-background-color', '$input_focus_background_color'),
this.createColorItem('input', 'Focus Color', '--input-focus-color', '$input_focus_color')
];
return ret;
}
/**
* @return {?}
*/
exportTheme() {
/** @type {?} */
let retStr = "";
for (var i = 0; i < this.items.length; i++) {
/** @type {?} */
const groupItem = (/** @type {?} */ (this.items[i]));
for (var k = 0; k < groupItem.items.length; k++) {
/** @type {?} */
const item = (/** @type {?} */ (groupItem.items[k]));
retStr += "\n" + item.scssVariableName + ":" + item.value + ";";
}
}
return retStr;
}
/**
* @private
* @param {?} name
* @param {?} description
* @param {?} cssPropertyName
* @param {?} scssVariableName
* @return {?}
*/
createColorItem(name, description, cssPropertyName, scssVariableName) {
return new ThemeColorItem(name, description, cssPropertyName, scssVariableName, this.themeWrapper, this.logger);
}
}
if (false) {
/**
* @type {?}
* @private
*/
DefaultThemeModel.prototype.themeWrapper;
/** @type {?} */
DefaultThemeModel.prototype.items;
/** @type {?} */
DefaultThemeModel.prototype.description;
/**
* @type {?}
* @private
*/
DefaultThemeModel.prototype.logger;
/**
* @type {?}
* @private
*/
DefaultThemeModel.prototype.document;
}
import { Inject } from '@angular/core';
import { NGXLogger } from 'web-console-core';
import { DOCUMENT } from '@angular/common';
export class ThemeModelBuilder {
/**
* @param {?} logger
* @param {?} document
*/
constructor(logger, document) {
this.logger = logger;
this.document = document;
this.logger.debug(LOG_TAG, 'Initializing Theme Builder');
}
/**
* @return {?}
*/
createModel() {
/** @type {?} */
let model = new DefaultThemeModel(this.logger, this.document);
//console.log("createModel :", model);
return model;
}
}
/** @nocollapse */
ThemeModelBuilder.ctorParameters = () => [
{ type: NGXLogger },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
if (false) {
/**
* @type {?}
* @private
*/
ThemeModelBuilder.prototype.logger;
/**
* @type {?}
* @private
*/
ThemeModelBuilder.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWVNb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL1RoZW1lRGVzaWduZXIvVGhlbWVNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUEsK0JBRUM7OztJQURDLGdDQUFtQjs7QUFHckIsTUFBTSxPQUFPLFVBQVU7Q0FHdEI7OztJQUZDLDJCQUFtQjs7SUFDbkIsaUNBQW9COzs7OztBQUd0QixNQUFNLE9BQWdCLFVBQVcsU0FBUSxVQUFVO0NBR2xEOzs7SUFGQyxpQ0FBb0I7Ozs7O0lBQ3BCLG1EQUErQjs7O01BSzNCLE9BQU8sR0FBRyxxQkFBcUI7QUFFckMsTUFBTSxPQUFPLGNBQWM7Ozs7Ozs7OztJQU16QixZQUFtQixJQUFZLEVBQ3RCLFdBQW1CLEVBQ25CLGVBQXVCLEVBQ3ZCLGdCQUFnQixFQUNmLFlBQWlCLEVBQ2pCLE1BQWlCO1FBTFIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUN2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQUE7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBSztRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBUHBCLFlBQU8sR0FBRyxDQUFFLFdBQVcsQ0FBQyxDQUFDO1FBUTVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Ozs7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCxJQUFXLEtBQUssQ0FBQyxVQUFpQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFD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QVc7O1lBQ1osS0FBSyxHQUFlLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pFLHNDQUFzQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7WUFiSSxTQUFTOzRDQUswQixNQUFNLFNBQUMsUUFBUTs7Ozs7OztJQUEzQyxtQ0FBeUI7Ozs7O0lBQUUscUNBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVJdGVtIHtcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVGhlbWVHcm91cCBpbXBsZW1lbnRzIFRoZW1lSXRlbSB7XG4gIGl0ZW1zOiBUaGVtZUl0ZW1bXTtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRoZW1lTW9kZWwgZXh0ZW5kcyBUaGVtZUdyb3VwIHtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgYWJzdHJhY3QgZXhwb3J0VGhlbWUoKTogc3RyaW5nO1xufVxuXG5cblxuY29uc3QgTE9HX1RBRyA9ICdbRGVmYXVsdFRoZW1lTW9kZWxdJztcblxuZXhwb3J0IGNsYXNzIFRoZW1lQ29sb3JJdGVtIGltcGxlbWVudHMgVGhlbWVJdGVtIHtcblxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBwcmVzZXRzID0gWyAnIzAwMDAwMDAwJ107XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgY3NzUHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHNjc3NWYXJpYWJsZU5hbWUsXG4gICAgcHJpdmF0ZSB0aGVtZVdyYXBwZXI6IGFueSxcbiAgICBwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0Q29sb3JQcm9wZXJ0eShjc3NQcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpe1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUoY29sb3JWYWx1ZTpzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGNvbG9yVmFsdWU7XG4gICAgdGhpcy50aGVtZVdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkodGhpcy5jc3NQcm9wZXJ0eU5hbWUsIGNvbG9yVmFsdWUpO1xuICAgIC8vY29uc29sZS5sb2coXCI+Pj4+PiBTZXQgY29sb3IgdmFsdWU6IFwiLCBjb2xvclZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JQcm9wZXJ0eSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRoZW1lV3JhcHBlcik7XG4gICAgdmFyIHJldCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUodmFyaWFibGVOYW1lKS50cmltKCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG5cbn1cblxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFRoZW1lTW9kZWwgaW1wbGVtZW50cyBUaGVtZU1vZGVsIHtcblxuICBwcml2YXRlIHRoZW1lV3JhcHBlcjogYW55O1xuXG4gIGl0ZW1zOiBUaGVtZUl0ZW1bXSA9IFtdO1xuICBkZXNjcmlwdGlvbjogXCJUaGVtZSBNb2RlbFwiO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsIHByaXZhdGUgZG9jdW1lbnQ6IGFueSl7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ0luaXRpYWxpemluZycgKTtcbiAgICB0aGlzLnRoZW1lV3JhcHBlciA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYXBwLXJvb3QnKTtcbiAgICB0aGlzLmNyZWF0ZU1vZGVsKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1vZGVsKCl7XG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlTWFpbkdyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZVRvb2xiYXJHcm91cCgpKTtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVIZWFkZXJHcm91cCgpKTtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVGb290ZXJHcm91cCgpKTtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVHcmlkR3JvdXAoKSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlVGFic0dyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUJ1dHRvbnNHcm91cCgpKTtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVDb21ib2JveEdyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUlucHV0R3JvdXAoKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1haW5Hcm91cCgpOiBUaGVtZUdyb3VwIHtcbiAgICBsZXQgcmV0ID0gbmV3IFRoZW1lR3JvdXAoKTtcbiAgICByZXQuZGVzY3JpcHRpb24gPSBcIk1haW5cIjtcbiAgICByZXQuaXRlbXMgPSBbXG5cbiAgICAgIC8vIE1haW4gQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYmFja2dyb3VuZCcsICdNYWluIEJhY2tncm91bmQnLCAnLS1tYWluLWJhY2tncm91bmQtY29sb3InLCAnJG1haW5fYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgICAvL1RpdGxlc1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYmFja2dyb3VuZCcsICdUaXRsZSAxIENvbG9yJywgJy0tdGl0bGUtMS1jb2xvcicsICckdGl0bGUxX2NvbG9yJyksXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cblxuICBwcml2YXRlIGNyZWF0ZUhlYWRlckdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiSGVhZGVyXCI7XG4gICAgcmV0Lml0ZW1zID0gW1xuICAgICAgLy8gSGVhZGVyIENvbG9yc1xuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2hlYWRlcicsICdIZWFkZXIgQmFja2dyb3VuZCcsICctLWhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yJywgJyRoZWFkZXJfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2hlYWRlcicsICdIZWFkZXIgQ29sb3InLCAnLS1oZWFkZXItY29sb3InLCAnJGhlYWRlcl9kZXNjcmlwdGlvbl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2hlYWRlcicsICdIZWFkZXIgSG92ZXInLCAnLS1oZWFkZXItY29sb3ItaG92ZXInLCAnJGhlYWRlcl9kZXNjcmlwdGlvbl9ob3Zlcl9jb2xvcicpXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb290ZXJHcm91cCgpOiBUaGVtZUdyb3VwIHtcbiAgICBsZXQgcmV0ID0gbmV3IFRoZW1lR3JvdXAoKTtcbiAgICByZXQuZGVzY3JpcHRpb24gPSBcIkZvb3RlclwiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIEZvb3RlciBDb2xvcnNcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdmb290ZXInLCAnRm9vdGVyIEJhY2tncm91bmQnLCAnLS1mb290ZXItYmFja2dyb3VuZC1jb2xvcicsJyRmb290ZXJfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2Zvb3RlcicsICdGb290ZXIgQ29sb3InLCAnLS1mb290ZXItY29sb3InLCckZm9vdGVyX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuXG4gIHByaXZhdGUgY3JlYXRlR3JpZEdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiR3JpZFwiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIEdyaWQgQ29sb3JzIFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBCYWNrZ3JvdW5kJywgJy0tZ3JpZC1iYWNrZ3JvdW5kLWNvbG9yJywnJGdyaWRfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBDb2xvcicsICctLWdyaWQtY29sb3InLCAnJGdyaWRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdncmlkJywgJ0dyaWQgQm9yZGVyIENvbG9yJywgJy0tZ3JpZC1ib3JkZXItY29sb3InLCAnJGdyaWRfYm9yZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIEhlYWRlciBDb2xvcicsICctLWdyaWQtaGVhZGVyLWNvbG9yJywgJyRncmlkX2hlYWRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBIZWFkZXIgQm9yZGVyJywgJy0tZ3JpZC1oZWFkZXItYm9yZGVyLWNvbG9yJywgJyRncmlkX2hlYWRlcl9ib3JkZXJfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdncmlkJywgJ0dyaWQgSG92ZXIgQmFja2dvcnVuZCcsICctLWdyaWQtcm93LWhvdmVyLWJhY2tncm91bmQtY29sb3InLCAnJGdyaWRfdHJfaG92ZXJfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBIb3ZlciBDb2xvcicsICctLWdyaWQtcm93LWhvdmVyLWNvbG9yJywgJyRncmlkX3RyX2hvdmVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIFNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3InLCAnLS1ncmlkLXJvdy1zZWxlY3RlZC1iYWNrZ3JvdW5kLWNvbG9yJywgJyRncmlkX3NlbGVjdGVkX3Jvd19jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBTZWxlY3RlZCBDb2xvcicsICctLWdyaWQtcm93LXNlbGVjdGVkLWNvbG9yJywgJyRncmlkX3NlbGVjdGVkX3JvdycpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBDb21tYW5kIENvbG9yJywgJy0tZ3JpZC1jb21tYW5kLWNvbG9yJywgJyRncmlkX2NvbW1hbmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdncmlkJywgJ0dyaWQgU2VsZWN0ZWQgUm93IENvbW1hbmQgQ29sb3InLCAnLS1ncmlkLXNlbGVjdGVkLXJvdy1jb21tYW5kLWNvbG9yJywgJyRncmlkX3NlbGVjdGVkX3Jvd19jb21tYW5kX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbiAgXG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sYmFyR3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJNYWluIFRvb2xiYXJcIjtcbiAgICByZXQuaXRlbXMgPSBbXG4gICAgICAvLyBUb29sYmFyIENvbG9yc1xuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ21haW5Ub29sYmFyJywgJ0JhY2tncm91bmQnLCAnLS1uYXYtYmFja2dyb3VuZC1jb2xvcicsICckbmF2X2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdtYWluVG9vbGJhcicsICdCb3JkZXInLCAnLS1uYXYtYm9yZGVyLWNvbG9yJywgJyRuYXZfYV9hX2JvcmRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ21haW5Ub29sYmFyJywgJ0NvbG9yJywgJy0tbmF2LWNvbG9yJywgJyRuYXZfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdtYWluVG9vbGJhcicsICdCYWNrZ3JvdW5kIEhvdmVyJywgJy0tbmF2LWhvdmVyLWJhY2tncm91bmQtY29sb3InLCckbmF2X2hvdmVyX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdtYWluVG9vbGJhcicsICdDb2xvciBIb3ZlcicsICctLW5hdi1ob3Zlci1jb2xvcicsJyRuYXZfaG92ZXJfY29sb3InKVxuICAgIF07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGFic0dyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiVGFic1wiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIFRvb2xiYXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgndGFicycsICdCYWNrZ3JvdW5kJywgJy0tdGFiLWJhY2tncm91bmQtY29sb3InLCAnJHRhYl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgndGFicycsICdDb2xvcicsICctLXRhYi1jb2xvcicsICckdGFiX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgndGFicycsICdTZWxlY3RlZCBCYWNrZ3JvdW5kJywgJy0tdGFiLXNlbGVjdGVkLWJhY2tncm91bmQtY29sb3InLCAnJHRhYl9zZWxlY3RlZF9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgndGFicycsICdTZWxlY3RlZCBDb2xvcicsICctLXRhYi1zZWxlY3RlZC1jb2xvcicsICckdGFiX3NlbGVjdGVkX2NvbG9yJyksXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cblxuICBwcml2YXRlIGNyZWF0ZUJ1dHRvbnNHcm91cCgpOiBUaGVtZUdyb3VwIHtcbiAgICBsZXQgcmV0ID0gbmV3IFRoZW1lR3JvdXAoKTtcbiAgICByZXQuZGVzY3JpcHRpb24gPSBcIkJ1dHRvbnNcIjtcbiAgICByZXQuaXRlbXMgPSBbXG4gICAgICAvLyBUb29sYmFyIENvbG9yc1xuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnQmFja2dyb3VuZCcsICctLWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yJywgJyRidXR0b25fYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnQ29sb3InLCAnLS1idXR0b24tY29sb3InLCAnJGJ1dHRvbl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnQm9yZGVyJywgJy0tYnV0dG9uLWJvcmRlci1jb2xvcicsICckYnV0dG9uX2JvcmRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnSG92ZXIgQmFja2dyb3VuZCcsICctLWJ1dHRvbi1ob3Zlci1iYWNrZ3JvdW5kLWNvbG9yJywgJyRidXR0b25faG92ZXJfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnSG92ZXIgQ29sb3InLCAnLS1idXR0b24taG92ZXItY29sb3InLCAnJGJ1dHRvbl9ob3Zlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnSG92ZXIgQm9yZGVyJywgJy0tYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcicsICckYnV0dG9uX2hvdmVyX2JvcmRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnRGlzYWJsZWQgQmFja2dyb3VuZCcsICctLWJ1dHRvbi1kaXNhYmxlZC1iYWNrZ3JvdW5kLWNvbG9yJywgJyRidXR0b25fZGlzYWJsZWRfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnRGlzYWJsZWQgQ29sb3InLCAnLS1idXR0b24tZGlzYWJsZWQtY29sb3InLCAnJGJ1dHRvbl9kaXNhYmxlZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2J1dHRvbnMnLCAnRGlzYWJsZWQgQm9yZGVyJywgJy0tYnV0dG9uLWRpc2FibGVkLWJvcmRlci1jb2xvcicsICckYnV0dG9uX2Rpc2FibGVkX2JvcmRlcl9jb2xvcicpXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21ib2JveEdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiQ29tYm9ib3hlc1wiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIFRvb2xiYXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnY29tYm9ib3gnLCAnQmFja2dyb3VuZCcsICctLWNvbWJvYm94LWJhY2tncm91bmQtY29sb3InLCAnJGNvbWJvYm94X2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdjb21ib2JveCcsICdDb2xvcicsICctLWNvbWJvYm94LWNvbG9yJywgJyRjb21ib2JveF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2NvbWJvYm94JywgJ1NlbGVjdGlvbiBCYWNrZ3JvdW5kJywgJy0tY29tYm9ib3gtc2VsZWN0ZWQtaXRlbS1iYWNrZ3JvdW5kLWNvbG9yJywgJyRjb21ib2JveF9zZWxlY3RlZF9pdGVtX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdjb21ib2JveCcsICdTZWxlY3Rpb24gQ29sb3InLCAnLS1jb21ib2JveC1zZWxlY3RlZC1pdGVtLWNvbG9yJywgJyRjb21ib2JveF9zZWxlY3RlZF9pdGVtX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnY29tYm9ib3gnLCAnQnV0dG9uIEJhY2tncm91bmQnLCAnLS1jb21ib2JveC1idXR0b24tYmFja2dyb3VuZC1jb2xvcicsICckY29tYm9ib3hfYnV0dG9uX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdjb21ib2JveCcsICdCdXR0b24gQ29sb3InLCAnLS1jb21ib2JveC1idXR0b24tY29sb3InLCAnJGNvbWJvYm94X2J1dHRvbl9jb2xvcicpXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbnB1dEdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiSW5wdXRcIjtcbiAgICByZXQuaXRlbXMgPSBbXG4gICAgICAvLyBUb29sYmFyIENvbG9yc1xuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2lucHV0JywgJ0JhY2tncm91bmQnLCAnLS1pbnB1dC1iYWNrZ3JvdW5kLWNvbG9yJywgJyRpbnB1dF9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaW5wdXQnLCAnQ29sb3InLCAnLS1pbnB1dC1jb2xvcicsICckaW5wdXRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdpbnB1dCcsICdQbGFjZWhvbGRlciBDb2xvcicsICctLWlucHV0LXBsYWNlaG9sZGVyLWNvbG9yJywgJyRpbnB1dF9wbGFjZWhvbGRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2lucHV0JywgJ0JvcmRlciBDb2xvcicsICctLWlucHV0LWJvcmRlci1jb2xvcicsICckaW5wdXRfYm9yZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaW5wdXQnLCAnRm9jdXMgQmFja2dyb3VuZCcsICctLWlucHV0LWZvY3VzLWJhY2tncm91bmQtY29sb3InLCAnJGlucHV0X2ZvY3VzX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdpbnB1dCcsICdGb2N1cyBDb2xvcicsICctLWlucHV0LWZvY3VzLWNvbG9yJywgJyRpbnB1dF9mb2N1c19jb2xvcicpXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cblxuICBwdWJsaWMgZXhwb3J0VGhlbWUoKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0U3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDtpKyspe1xuICAgICAgY29uc3QgZ3JvdXBJdGVtIDogVGhlbWVHcm91cCA9IHRoaXMuaXRlbXNbaV0gYXMgVGhlbWVHcm91cDtcbiAgICAgIGZvcih2YXIgaz0wO2s8Z3JvdXBJdGVtLml0ZW1zLmxlbmd0aDtrKyspe1xuICAgICAgICBjb25zdCBpdGVtOlRoZW1lQ29sb3JJdGVtID0gZ3JvdXBJdGVtLml0ZW1zW2tdIGFzIFRoZW1lQ29sb3JJdGVtO1xuICAgICAgICByZXRTdHIgKz0gXCJcXG5cIiArIGl0ZW0uc2Nzc1ZhcmlhYmxlTmFtZSArXCI6XCIgKyBpdGVtLnZhbHVlICsgXCI7XCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXRTdHI7XG4gIH1cblxuXG4gIHByaXZhdGUgY3JlYXRlQ29sb3JJdGVtKG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246c3RyaW5nLCBjc3NQcm9wZXJ0eU5hbWU6IHN0cmluZywgc2Nzc1ZhcmlhYmxlTmFtZTpzdHJpbmcpOiBUaGVtZUNvbG9ySXRlbSB7XG4gICAgcmV0dXJuIG5ldyBUaGVtZUNvbG9ySXRlbShuYW1lLCBkZXNjcmlwdGlvbiwgY3NzUHJvcGVydHlOYW1lLCBzY3NzVmFyaWFibGVOYW1lLCB0aGlzLnRoZW1lV3JhcHBlciwgdGhpcy5sb2dnZXIpO1xuICB9XG5cbn1cblxuXG5pbXBvcnQgeyBJbmplY3QsIGRlc3Ryb3lQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZU1vZGVsQnVpbGRlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLCBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnkpe1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ0luaXRpYWxpemluZyBUaGVtZSBCdWlsZGVyJyApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVNb2RlbCgpOiBUaGVtZU1vZGVsIHtcbiAgICAgIGxldCBtb2RlbDogVGhlbWVNb2RlbCA9IG5ldyBEZWZhdWx0VGhlbWVNb2RlbCh0aGlzLmxvZ2dlciwgdGhpcy5kb2N1bWVudCk7XG4gICAgICAvL2NvbnNvbGUubG9nKFwiY3JlYXRlTW9kZWwgOlwiLCBtb2RlbCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuXG5cbn1cbiJdfQ==