@lunaeme/circe-core
Version:
Circe :: Angular Core Services and Tools
234 lines • 36.2 kB
JavaScript
var BoxModelService_1;
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { ccElementFields, ccHashTypes } from '../_types/element.types';
export const boxModelTypeConstants = {
HORIZONTAL: 'horizontal',
VERTICAL: 'vertical'
};
let BoxModelService = BoxModelService_1 = class BoxModelService {
constructor() {
this._defaultBoxModelType = boxModelTypeConstants.VERTICAL;
this._defaultElementHashType = ccHashTypes.class;
this._defaultComputedStylePropertyProcessed = false;
this._allowCssUnits = ['px', '%'];
this._additionHorizontalInsideClasses = ['padding-left', 'padding-right', 'border-left-width', 'border-right-width'];
this._additionHorizontalOutsideClasses = ['margin-left', 'margin-right'];
this._additionVerticalInsideClasses = ['padding-top', 'padding-bottom', 'border-top-width', 'border-bottom-width'];
this._additionVerticalOutsideClasses = ['margin-top', 'margin-bottom'];
this._fontSizeRule = { applyOnElements: ['i'], boxModelType: boxModelTypeConstants.HORIZONTAL };
}
/**
* _isElementHash
*
* @description
* Checks if element given param is ElementHash type.
*/
static _isElementHash(element) {
return !!(typeof element === 'object' &&
ccElementFields.type in element &&
ccElementFields.name in element &&
(Object.keys(element).length === 2 || Object.keys(element).length === 3));
}
/**
* _isElementQuery
*
* @description
* Checks if element given param is ElementQuery type.
*/
static _isElementQuery(element) {
return !!(typeof element === 'object' &&
ccElementFields.query in element &&
(Object.keys(element).length === 1 || Object.keys(element).length === 2));
}
/**
* _isNativeDomElement
*
* @description
* Checks if element given param is a native DOM element.
*/
static _isNativeDomElement(param) {
const _paramsToCheck = [
'getBoundingClientRect', 'getElementsByClassName', 'getElementsByTagName', 'querySelector'
];
return (!!param) ? (_paramsToCheck.map((e) => e in param)).every((el) => !!el) : false;
}
/**
* _convertToElementIdArray
*
* @description
* Transform elementId type to array of Dom elements.
*/
_convertToElementIdArray(elementId) {
const _auxArgument = [];
const _elementId = (Array.isArray(elementId)) ? elementId : [elementId];
for (const element of _elementId) {
_auxArgument.push(this.getElement(element));
}
return _auxArgument;
}
_getElementAdditions(element, boxModelType) {
const _type = boxModelType || this._defaultBoxModelType;
const _elementStyle = window.getComputedStyle(element);
const _output = {
boxModelAdditionInside: 0,
boxModelAdditionOutside: 0
};
const _auxOutputInside = [];
const _auxOutputOutside = [];
if (_type === boxModelTypeConstants.HORIZONTAL) {
this._additionHorizontalInsideClasses.forEach((e) => {
_auxOutputInside.push(_elementStyle.getPropertyValue(e));
});
this._additionHorizontalOutsideClasses.forEach((e) => {
_auxOutputOutside.push(_elementStyle.getPropertyValue(e));
});
}
else {
this._additionVerticalInsideClasses.forEach((e) => {
_auxOutputInside.push(_elementStyle.getPropertyValue(e));
});
this._additionVerticalOutsideClasses.forEach((e) => {
_auxOutputOutside.push(_elementStyle.getPropertyValue(e));
});
}
_auxOutputInside.forEach((el) => {
if (el !== '0px') {
_output.boxModelAdditionInside += this.readCssUnits(el).value;
}
});
_auxOutputOutside.forEach((el) => {
if (el !== '0px') {
_output.boxModelAdditionOutside += this.readCssUnits(el).value;
}
});
return _output;
}
getComputedStyleProperty(element, property, processed) {
const _processed = processed || this._defaultComputedStylePropertyProcessed;
const _elementComputedStyles = window.getComputedStyle(element);
const _output = _elementComputedStyles.getPropertyValue(property);
if (_output && _processed) {
return this.readCssUnits(_output);
}
return _output;
}
processElementForSpecialRules(element) {
if (this._fontSizeRule.applyOnElements.includes(element.tagName.toLowerCase())) {
const _elementBoxModel = this.getBoxModel(element, boxModelTypeConstants.HORIZONTAL);
const _elementFontSize = this.getComputedStyleProperty(element, 'font-size', true);
if (_elementBoxModel.boxModelExtractedInside !== _elementFontSize.value) {
element.style.width = `${_elementFontSize.value}px`;
return element;
}
}
return element;
}
readCssUnits(expression) {
const _output = { value: 0, unit: '' };
this._allowCssUnits.forEach((e) => {
if (expression.includes(e)) {
_output.unit = e;
const _aux = expression.split(e).filter((el) => !!el);
if (_aux.length === 1) {
_output.value = Number(_aux[0]);
}
return;
}
});
return (_output.value && _output.unit) ? _output : null;
}
processSizeString(sizeString) {
const _output = { with: null, height: null };
if (sizeString) {
const _auxSize = sizeString.split(' ');
if (_auxSize.length === 1) {
const _cssUnit = this.readCssUnits(_auxSize[0]);
_output.with = _cssUnit;
_output.height = _cssUnit;
}
else if (_auxSize.length === 2) {
_output.height = this.readCssUnits(_auxSize[0]);
_output.with = this.readCssUnits(_auxSize[1]);
}
}
return (_output.with && _output.height) ? _output : null;
}
/**
* getElement
*
* @description
* Returns an element DOM native object from different types of given params.
*/
getElement(element) {
let _output = element;
let _element = element;
let _shadowElement = document;
if (typeof element === 'string') {
_element = { type: this._defaultElementHashType, name: element };
}
else {
if (ccElementFields.shadowElement in _element) {
_shadowElement = this.getElement(_element.shadowElement);
}
}
if (!BoxModelService_1._isNativeDomElement(_element)) {
if (BoxModelService_1._isElementHash(_element)) {
switch (_element.type) {
case ccHashTypes.class:
_output = _shadowElement.getElementsByClassName(_element.name).item(0);
break;
case ccHashTypes.tag:
_output = _shadowElement.getElementsByTagName(_element.name).item(0);
break;
case ccHashTypes.id:
_output = document.getElementById(_element.name);
break;
}
}
else if (BoxModelService_1._isElementQuery(_element)) {
_output = _shadowElement.querySelector(_element.query);
}
}
if (!BoxModelService_1._isNativeDomElement(_output)) {
throw new Error('BoxModel.getElement: Unrecognizable element.');
}
return _output;
}
getBoxModel(elementId, boxModelType) {
const _output = {
type: boxModelType || this._defaultBoxModelType,
boxModel: 0,
boxModelAdditions: 0,
boxModelAggregated: 0,
boxModelExtracted: 0,
boxModelAdditionsInside: 0,
boxModelAdditionsOutside: 0,
boxModelAggregatedInside: 0,
boxModelAggregatedOutside: 0,
boxModelExtractedInside: 0,
boxModelExtractedOutside: 0
};
const _elementId = this._convertToElementIdArray(elementId);
_elementId.forEach((e) => {
const _elementRect = e.getBoundingClientRect();
const _additions = this._getElementAdditions(e, _output.type);
_output.boxModel += (_output.type === boxModelTypeConstants.HORIZONTAL) ? _elementRect.width : _elementRect.height;
_output.boxModelAdditions += _additions.boxModelAdditionInside + _additions.boxModelAdditionOutside;
_output.boxModelAdditionsInside += _additions.boxModelAdditionInside;
_output.boxModelAdditionsOutside += _additions.boxModelAdditionOutside;
});
_output.boxModelAggregated = _output.boxModel + _output.boxModelAdditions;
_output.boxModelExtracted = _output.boxModel - _output.boxModelAdditions;
_output.boxModelAggregatedInside = _output.boxModel + _output.boxModelAdditionsInside;
_output.boxModelAggregatedOutside = _output.boxModel + _output.boxModelAdditionsOutside;
_output.boxModelExtractedInside = _output.boxModel - _output.boxModelAdditionsInside;
_output.boxModelExtractedOutside = _output.boxModel - _output.boxModelAdditionsOutside;
return _output;
}
};
BoxModelService = BoxModelService_1 = __decorate([
Injectable()
], BoxModelService);
export { BoxModelService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LW1vZGVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVuYWVtZS9jaXJjZS1jb3JlLyIsInNvdXJjZXMiOlsibGliL2JveC1tb2RlbC9ib3gtbW9kZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFhLGVBQWUsRUFBNkMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUF1QzVILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLFVBQVUsRUFBRSxZQUE0QjtJQUN4QyxRQUFRLEVBQUUsVUFBMEI7Q0FDckMsQ0FBQztBQUVZLElBQWEsZUFBZSx1QkFBNUIsTUFBYSxlQUFlO0lBZXhDO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQztRQUUzRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVqRCxJQUFJLENBQUMsc0NBQXNDLEdBQUcsS0FBSyxDQUFDO1FBRXBELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3JILElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsK0JBQStCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdB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QUNGLENBQUE7QUF6UDBCLGVBQWU7SUFBekMsVUFBVSxFQUFFO0dBQWMsZUFBZSxDQXlQekM7U0F6UDBCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDY0VsZW1lbnQsIGNjRWxlbWVudEZpZWxkcywgQ2NFbGVtZW50SGFzaCwgQ2NFbGVtZW50UXVlcnksIENjSGFzaFR5cGUsIGNjSGFzaFR5cGVzfSBmcm9tICcuLi9fdHlwZXMvZWxlbWVudC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZU9iamVjdCB7XG4gIHdpdGg6IFByb2Nlc3NlZFVuaXRPYmplY3Q7XG4gIGhlaWdodDogUHJvY2Vzc2VkVW5pdE9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50SWQgPSBDY0VsZW1lbnQgfCBBcnJheTxDY0VsZW1lbnQ+O1xuXG5leHBvcnQgdHlwZSBCb3hNb2RlbFR5cGUgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IGludGVyZmFjZSBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICB0eXBlOiBCb3hNb2RlbFR5cGU7XG4gIGJveE1vZGVsOiBudW1iZXI7XG4gIGJveE1vZGVsQWRkaXRpb25zOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZDogbnVtYmVyO1xuICBib3hNb2RlbEV4dHJhY3RlZDogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc0luc2lkZTogbnVtYmVyO1xuICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZ2dyZWdhdGVkSW5zaWRlOiBudW1iZXI7XG4gIGJveE1vZGVsQWdncmVnYXRlZE91dHNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxFeHRyYWN0ZWRPdXRzaWRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94TW9kZWxBZGRpdGlvbk9iamVjdCB7XG4gIGJveE1vZGVsQWRkaXRpb25JbnNpZGU6IG51bWJlcjtcbiAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGVjaWFsUnVsZU9iamVjdCB7XG4gIGFwcGx5T25FbGVtZW50czogQXJyYXk8c3RyaW5nPjtcbiAgYm94TW9kZWxUeXBlOiBCb3hNb2RlbFR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBib3hNb2RlbFR5cGVDb25zdGFudHMgPSB7XG4gIEhPUklaT05UQUw6ICdob3Jpem9udGFsJyBhcyBCb3hNb2RlbFR5cGUsXG4gIFZFUlRJQ0FMOiAndmVydGljYWwnIGFzIEJveE1vZGVsVHlwZVxufTtcblxuQEluamVjdGFibGUoKSBleHBvcnQgY2xhc3MgQm94TW9kZWxTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEJveE1vZGVsVHlwZTogQm94TW9kZWxUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRFbGVtZW50SGFzaFR5cGU6IENjSGFzaFR5cGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd0Nzc1VuaXRzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxJbnNpZGVDbGFzc2VzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWRkaXRpb25WZXJ0aWNhbEluc2lkZUNsYXNzZXM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkZGl0aW9uVmVydGljYWxPdXRzaWRlQ2xhc3NlczogQXJyYXk8c3RyaW5nPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mb250U2l6ZVJ1bGU6IFNwZWNpYWxSdWxlT2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGUgPSBib3hNb2RlbFR5cGVDb25zdGFudHMuVkVSVElDQUw7XG5cbiAgICB0aGlzLl9kZWZhdWx0RWxlbWVudEhhc2hUeXBlID0gY2NIYXNoVHlwZXMuY2xhc3M7XG5cbiAgICB0aGlzLl9kZWZhdWx0Q29tcHV0ZWRTdHlsZVByb3BlcnR5UHJvY2Vzc2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzID0gWydweCcsICclJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsSW5zaWRlQ2xhc3NlcyA9IFsncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLWxlZnQtd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJ107XG4gICAgdGhpcy5fYWRkaXRpb25Ib3Jpem9udGFsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi1sZWZ0JywgJ21hcmdpbi1yaWdodCddO1xuICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzID0gWydwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTtcbiAgICB0aGlzLl9hZGRpdGlvblZlcnRpY2FsT3V0c2lkZUNsYXNzZXMgPSBbJ21hcmdpbi10b3AnLCAnbWFyZ2luLWJvdHRvbSddO1xuXG4gICAgdGhpcy5fZm9udFNpemVSdWxlID0geyBhcHBseU9uRWxlbWVudHM6IFsnaSddLCBib3hNb2RlbFR5cGU6IGJveE1vZGVsVHlwZUNvbnN0YW50cy5IT1JJWk9OVEFMIH07XG4gIH1cblxuICAvKipcbiAgICogX2lzRWxlbWVudEhhc2hcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRIYXNoIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9pc0VsZW1lbnRIYXNoKGVsZW1lbnQ6IENjRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLnR5cGUgaW4gZWxlbWVudCAmJlxuICAgICAgY2NFbGVtZW50RmllbGRzLm5hbWUgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMiB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNFbGVtZW50UXVlcnlcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENoZWNrcyBpZiBlbGVtZW50IGdpdmVuIHBhcmFtIGlzIEVsZW1lbnRRdWVyeSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfaXNFbGVtZW50UXVlcnkoZWxlbWVudDogQ2NFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmXG4gICAgICBjY0VsZW1lbnRGaWVsZHMucXVlcnkgaW4gZWxlbWVudCAmJlxuICAgICAgKE9iamVjdC5rZXlzKGVsZW1lbnQpLmxlbmd0aCA9PT0gMSB8fCBPYmplY3Qua2V5cyhlbGVtZW50KS5sZW5ndGggPT09IDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBfaXNOYXRpdmVEb21FbGVtZW50XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDaGVja3MgaWYgZWxlbWVudCBnaXZlbiBwYXJhbSBpcyBhIG5hdGl2ZSBET00gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2lzTmF0aXZlRG9tRWxlbWVudChwYXJhbTogYW55KTogcGFyYW0gaXMgRWxlbWVudCB7XG4gICAgY29uc3QgX3BhcmFtc1RvQ2hlY2s6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgICAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnLCAnZ2V0RWxlbWVudHNCeVRhZ05hbWUnLCAncXVlcnlTZWxlY3RvcidcbiAgICBdO1xuICAgIHJldHVybiAoISFwYXJhbSkgPyAoX3BhcmFtc1RvQ2hlY2subWFwKChlOiBzdHJpbmcpID0+IGUgaW4gcGFyYW0pKS5ldmVyeSgoZWwpID0+ICEhZWwpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogX2NvbnZlcnRUb0VsZW1lbnRJZEFycmF5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFuc2Zvcm0gZWxlbWVudElkIHR5cGUgdG8gYXJyYXkgb2YgRG9tIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkOiBFbGVtZW50SWQpOiBBcnJheTxFbGVtZW50PiB7XG4gICAgY29uc3QgX2F1eEFyZ3VtZW50OiBBcnJheTxFbGVtZW50PiA9IFtdO1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PENjRWxlbWVudD4gPSAoQXJyYXkuaXNBcnJheShlbGVtZW50SWQpKSA/IGVsZW1lbnRJZCA6IFtlbGVtZW50SWRdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBfZWxlbWVudElkKSB7XG4gICAgICBfYXV4QXJndW1lbnQucHVzaCh0aGlzLmdldEVsZW1lbnQoZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gX2F1eEFyZ3VtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RWxlbWVudEFkZGl0aW9ucyhlbGVtZW50OiBFbGVtZW50LCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbEFkZGl0aW9uT2JqZWN0IHtcbiAgICBjb25zdCBfdHlwZTogQm94TW9kZWxUeXBlID0gYm94TW9kZWxUeXBlIHx8IHRoaXMuX2RlZmF1bHRCb3hNb2RlbFR5cGU7XG4gICAgY29uc3QgX2VsZW1lbnRTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsQWRkaXRpb25PYmplY3QgPSB7XG4gICAgICBib3hNb2RlbEFkZGl0aW9uSW5zaWRlOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbk91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9hdXhPdXRwdXRJbnNpZGU6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBfYXV4T3V0cHV0T3V0c2lkZTogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGlmIChfdHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uSG9yaXpvbnRhbEluc2lkZUNsYXNzZXMuZm9yRWFjaCgoZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIF9hdXhPdXRwdXRJbnNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hZGRpdGlvbkhvcml6b250YWxPdXRzaWRlQ2xhc3Nlcy5mb3JFYWNoKChlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgX2F1eE91dHB1dE91dHNpZGUucHVzaChfZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uVmVydGljYWxJbnNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0SW5zaWRlLnB1c2goX2VsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fYWRkaXRpb25WZXJ0aWNhbE91dHNpZGVDbGFzc2VzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgICBfYXV4T3V0cHV0T3V0c2lkZS5wdXNoKF9lbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgX2F1eE91dHB1dEluc2lkZS5mb3JFYWNoKChlbDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZWwgIT09ICcwcHgnKSB7XG4gICAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbkluc2lkZSArPSB0aGlzLnJlYWRDc3NVbml0cyhlbCkudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2F1eE91dHB1dE91dHNpZGUuZm9yRWFjaCgoZWw6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGVsICE9PSAnMHB4Jykge1xuICAgICAgICBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25PdXRzaWRlICs9IHRoaXMucmVhZENzc1VuaXRzKGVsKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX291dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wdXRlZFN0eWxlUHJvcGVydHkoZWxlbWVudDogRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgcHJvY2Vzc2VkPzogYm9vbGVhbik6IHN0cmluZyB8IFByb2Nlc3NlZFVuaXRPYmplY3Qge1xuICAgIGNvbnN0IF9wcm9jZXNzZWQ6IGJvb2xlYW4gPSBwcm9jZXNzZWQgfHwgdGhpcy5fZGVmYXVsdENvbXB1dGVkU3R5bGVQcm9wZXJ0eVByb2Nlc3NlZDtcbiAgICBjb25zdCBfZWxlbWVudENvbXB1dGVkU3R5bGVzOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgY29uc3QgX291dHB1dDogc3RyaW5nID0gX2VsZW1lbnRDb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgICBpZiAoX291dHB1dCAmJiBfcHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQ3NzVW5pdHMoX291dHB1dCk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NFbGVtZW50Rm9yU3BlY2lhbFJ1bGVzKGVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBpZiAodGhpcy5fZm9udFNpemVSdWxlLmFwcGx5T25FbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGNvbnN0IF9lbGVtZW50Qm94TW9kZWw6IEJveE1vZGVsU3dhcE9iamVjdCA9IHRoaXMuZ2V0Qm94TW9kZWwoZWxlbWVudCwgYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpO1xuICAgICAgY29uc3QgX2VsZW1lbnRGb250U2l6ZTogUHJvY2Vzc2VkVW5pdE9iamVjdCA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVByb3BlcnR5KGVsZW1lbnQsICdmb250LXNpemUnLCB0cnVlKSBhcyBQcm9jZXNzZWRVbml0T2JqZWN0O1xuICAgICAgaWYgKF9lbGVtZW50Qm94TW9kZWwuYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGUgIT09IF9lbGVtZW50Rm9udFNpemUudmFsdWUpIHtcbiAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLndpZHRoID0gYCR7X2VsZW1lbnRGb250U2l6ZS52YWx1ZX1weGA7XG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIHJlYWRDc3NVbml0cyhleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9jZXNzZWRVbml0T2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0geyB2YWx1ZTogMCwgdW5pdDogJycgfTtcbiAgICB0aGlzLl9hbGxvd0Nzc1VuaXRzLmZvckVhY2goKGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGV4cHJlc3Npb24uaW5jbHVkZXMoZSkpIHtcbiAgICAgICAgX291dHB1dC51bml0ID0gZTtcbiAgICAgICAgY29uc3QgX2F1eDogQXJyYXk8c3RyaW5nPiA9IGV4cHJlc3Npb24uc3BsaXQoZSkuZmlsdGVyKChlbDogc3RyaW5nKSA9PiAhIWVsKTtcbiAgICAgICAgaWYgKF9hdXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgX291dHB1dC52YWx1ZSA9IE51bWJlcihfYXV4WzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIChfb3V0cHV0LnZhbHVlICYmIF9vdXRwdXQudW5pdCkgPyBfb3V0cHV0IDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzU2l6ZVN0cmluZyhzaXplU3RyaW5nOiBzdHJpbmcpOiBTaXplT2JqZWN0IHtcbiAgICBjb25zdCBfb3V0cHV0OiBTaXplT2JqZWN0ID0geyB3aXRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfTtcbiAgICBpZiAoc2l6ZVN0cmluZykge1xuICAgICAgY29uc3QgX2F1eFNpemU6IEFycmF5PHN0cmluZz4gPSBzaXplU3RyaW5nLnNwbGl0KCcgJyk7XG4gICAgICBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IF9jc3NVbml0OiBQcm9jZXNzZWRVbml0T2JqZWN0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSBfY3NzVW5pdDtcbiAgICAgICAgX291dHB1dC5oZWlnaHQgPSBfY3NzVW5pdDtcbiAgICAgIH0gZWxzZSBpZiAoX2F1eFNpemUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIF9vdXRwdXQuaGVpZ2h0ID0gdGhpcy5yZWFkQ3NzVW5pdHMoX2F1eFNpemVbMF0pO1xuICAgICAgICBfb3V0cHV0LndpdGggPSB0aGlzLnJlYWRDc3NVbml0cyhfYXV4U2l6ZVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoX291dHB1dC53aXRoICYmIF9vdXRwdXQuaGVpZ2h0KSA/IF9vdXRwdXQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldEVsZW1lbnRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgYW4gZWxlbWVudCBET00gbmF0aXZlIG9iamVjdCBmcm9tIGRpZmZlcmVudCB0eXBlcyBvZiBnaXZlbiBwYXJhbXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChlbGVtZW50OiBDY0VsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBsZXQgX291dHB1dDogRWxlbWVudCA9IGVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICBsZXQgX2VsZW1lbnQ6IENjRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgbGV0IF9zaGFkb3dFbGVtZW50OiBFbGVtZW50IHwgRG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBfZWxlbWVudCA9IHsgdHlwZTogdGhpcy5fZGVmYXVsdEVsZW1lbnRIYXNoVHlwZSwgbmFtZTogZWxlbWVudCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2NFbGVtZW50RmllbGRzLnNoYWRvd0VsZW1lbnQgaW4gKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkpIHtcbiAgICAgICAgX3NoYWRvd0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2ggfCBDY0VsZW1lbnRRdWVyeSkuc2hhZG93RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghQm94TW9kZWxTZXJ2aWNlLl9pc05hdGl2ZURvbUVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICBpZiAoQm94TW9kZWxTZXJ2aWNlLl9pc0VsZW1lbnRIYXNoKF9lbGVtZW50KSkge1xuICAgICAgICBzd2l0Y2ggKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy5jbGFzczpcbiAgICAgICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKS5pdGVtKDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjY0hhc2hUeXBlcy50YWc6XG4gICAgICAgICAgICBfb3V0cHV0ID0gX3NoYWRvd0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoKF9lbGVtZW50IGFzIENjRWxlbWVudEhhc2gpLm5hbWUpLml0ZW0oMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGNjSGFzaFR5cGVzLmlkOlxuICAgICAgICAgICAgX291dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKChfZWxlbWVudCBhcyBDY0VsZW1lbnRIYXNoKS5uYW1lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEJveE1vZGVsU2VydmljZS5faXNFbGVtZW50UXVlcnkoX2VsZW1lbnQpKSB7XG4gICAgICAgIF9vdXRwdXQgPSBfc2hhZG93RWxlbWVudC5xdWVyeVNlbGVjdG9yKChfZWxlbWVudCBhcyBDY0VsZW1lbnRRdWVyeSkucXVlcnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIUJveE1vZGVsU2VydmljZS5faXNOYXRpdmVEb21FbGVtZW50KF9vdXRwdXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JveE1vZGVsLmdldEVsZW1lbnQ6IFVucmVjb2duaXphYmxlIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIGdldEJveE1vZGVsKGVsZW1lbnRJZDogRWxlbWVudElkLCBib3hNb2RlbFR5cGU/OiBCb3hNb2RlbFR5cGUpOiBCb3hNb2RlbFN3YXBPYmplY3Qge1xuICAgIGNvbnN0IF9vdXRwdXQ6IEJveE1vZGVsU3dhcE9iamVjdCA9IHtcbiAgICAgIHR5cGU6IGJveE1vZGVsVHlwZSB8fCB0aGlzLl9kZWZhdWx0Qm94TW9kZWxUeXBlLFxuICAgICAgYm94TW9kZWw6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uczogMCxcbiAgICAgIGJveE1vZGVsQWdncmVnYXRlZDogMCxcbiAgICAgIGJveE1vZGVsRXh0cmFjdGVkOiAwLFxuICAgICAgYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFkZGl0aW9uc091dHNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEFnZ3JlZ2F0ZWRPdXRzaWRlOiAwLFxuICAgICAgYm94TW9kZWxFeHRyYWN0ZWRJbnNpZGU6IDAsXG4gICAgICBib3hNb2RlbEV4dHJhY3RlZE91dHNpZGU6IDBcbiAgICB9O1xuICAgIGNvbnN0IF9lbGVtZW50SWQ6IEFycmF5PEVsZW1lbnQ+ID0gdGhpcy5fY29udmVydFRvRWxlbWVudElkQXJyYXkoZWxlbWVudElkKTtcbiAgICBfZWxlbWVudElkLmZvckVhY2goKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IF9lbGVtZW50UmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgX2FkZGl0aW9uczogQm94TW9kZWxBZGRpdGlvbk9iamVjdCA9IHRoaXMuX2dldEVsZW1lbnRBZGRpdGlvbnMoZSwgX291dHB1dC50eXBlKTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWwgKz0gKF9vdXRwdXQudHlwZSA9PT0gYm94TW9kZWxUeXBlQ29uc3RhbnRzLkhPUklaT05UQUwpID8gX2VsZW1lbnRSZWN0LndpZHRoIDogX2VsZW1lbnRSZWN0LmhlaWdodDtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnMgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlICsgX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICAgIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uSW5zaWRlO1xuICAgICAgX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGUgKz0gX2FkZGl0aW9ucy5ib3hNb2RlbEFkZGl0aW9uT3V0c2lkZTtcbiAgICB9KTtcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZCA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zO1xuICAgIF9vdXRwdXQuYm94TW9kZWxFeHRyYWN0ZWQgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9ucztcbiAgICBfb3V0cHV0LmJveE1vZGVsQWdncmVnYXRlZEluc2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zSW5zaWRlO1xuICAgIF9vdXRwdXQuYm94TW9kZWxBZ2dyZWdhdGVkT3V0c2lkZSA9IF9vdXRwdXQuYm94TW9kZWwgKyBfb3V0cHV0LmJveE1vZGVsQWRkaXRpb25zT3V0c2lkZTtcbiAgICBfb3V0cHV0LmJveE1vZGVsRXh0cmFjdGVkSW5zaWRlID0gX291dHB1dC5ib3hNb2RlbCAtIF9vdXRwdXQuYm94TW9kZWxBZGRpdGlvbnNJbnNpZGU7XG4gICAgX291dHB1dC5ib3hNb2RlbEV4dHJhY3RlZE91dHNpZGUgPSBfb3V0cHV0LmJveE1vZGVsIC0gX291dHB1dC5ib3hNb2RlbEFkZGl0aW9uc091dHNpZGU7XG4gICAgcmV0dXJuIF9vdXRwdXQ7XG4gIH1cbn1cbiJdfQ==