acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
289 lines (288 loc) • 39.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
import { EqualCondition } from '../../../core/rules/equal-condition';
import { ConditionType } from '../../../core/models/conditiontype.model';
import { GreaterThanCondition } from '../../../core/rules/greater-than-condition';
import { LessThanCondition } from '../../../core/rules/less-than-condition';
import { GreaterThanOrEqualsCondition } from '../../../core/rules/greater-than-or-equals-condition';
import { LessThanOrEqualsCondition } from '../../../core/rules/less-than-or-equals-condition';
import { ContainsCondition } from '../../../core/rules/contains-condition';
import { AndCondition } from '../../../core/rules/and-condition';
import { OrCondition } from '../../../core/rules/or-condition';
import { ArrayCheckerService } from './array-checker.service';
import { NotCondition } from '../../../core/rules/not-condition';
export class ConditionsCreationService {
/**
* @param {?} arrayCheckerService
*/
constructor(arrayCheckerService) {
this.arrayCheckerService = arrayCheckerService;
}
/**
* @param {?} conditionJSON
* @return {?}
*/
returnConditionType(conditionJSON) {
const /** @type {?} */ conditionType = new ConditionType();
conditionType.comparisonValue = conditionJSON.Attr.ComparisonValue;
conditionType.dataElementId = conditionJSON.Attr.DataElementId;
return conditionType;
}
/**
* @param {?} branchJSON
* @return {?}
*/
returnCondition(branchJSON) {
let /** @type {?} */ condition;
if (branchJSON.hasOwnProperty('EqualCondition')) {
condition = new EqualCondition(this.returnConditionType(branchJSON.EqualCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanCondition')) {
condition = new GreaterThanCondition(this.returnConditionType(branchJSON.GreaterThanCondition));
}
if (branchJSON.hasOwnProperty('LessThanCondition')) {
condition = new LessThanCondition(this.returnConditionType(branchJSON.LessThanCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanOrEqualsCondition')) {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(branchJSON.GreaterThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('LessThanOrEqualsCondition')) {
condition = new LessThanOrEqualsCondition(this.returnConditionType(branchJSON.LessThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('ContainsCondition')) {
condition = new ContainsCondition(this.returnConditionType(branchJSON.ContainsCondition));
}
// if (condition !== undefined) {
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : false;
// }
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : true;
return condition;
}
/**
* @param {?} compositeElementJSON
* @return {?}
*/
isComposite(compositeElementJSON) {
return compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
}
/**
* @param {?} conditionIdentifier
* @param {?} conditionJSON
* @return {?}
*/
returnConditionFromJSON(conditionIdentifier, conditionJSON) {
let /** @type {?} */ condition;
if (conditionIdentifier === 'EqualCondition') {
condition = new EqualCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanCondition') {
condition = new GreaterThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanCondition') {
condition = new LessThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanOrEqualsCondition') {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanOrEqualsCondition') {
condition = new LessThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'ContainsCondition') {
condition = new ContainsCondition(this.returnConditionType(conditionJSON));
}
return condition;
}
/**
* @param {?} conditionsJSON
* @return {?}
*/
returnConditions(conditionsJSON) {
let /** @type {?} */ conditions;
const /** @type {?} */ conditionIdentifiers = ['EqualCondition', 'GreaterThanCondition', 'LessThanCondition',
'GreaterThanOrEqualsCondition', 'LessThanOrEqualsCondition', 'ContainsCondition'];
for (const /** @type {?} */ conditionIdentifier of conditionIdentifiers) {
const /** @type {?} */ conditionJSON = conditionsJSON[conditionIdentifier];
if (conditionJSON !== undefined) {
conditions = new Array();
if (this.arrayCheckerService.isArray(conditionJSON)) {
for (const /** @type {?} */ jsonValue of conditionJSON) {
conditions.push(this.returnConditionFromJSON(conditionIdentifier, jsonValue));
}
}
else {
conditions.push(this.returnConditionFromJSON(conditionIdentifier, conditionJSON));
}
}
}
return conditions;
}
/**
* @param {?} compositeElementJSON
* @return {?}
*/
isHybrid(compositeElementJSON) {
const /** @type {?} */ compositeExists = compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
const /** @type {?} */ primitiveExists = compositeElementJSON.hasOwnProperty('EqualCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanCondition') ||
compositeElementJSON.hasOwnProperty('LessThanCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('LessThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('ContainsCondition');
return compositeExists && primitiveExists;
}
/**
* @param {?} data
* @return {?}
*/
returnCompositeCondition(data) {
if (!this.isComposite(data)) {
return;
}
let /** @type {?} */ compositeConditionJSON;
let /** @type {?} */ compositeCondition;
if (data.hasOwnProperty('AndCondition')) {
compositeConditionJSON = data.AndCondition;
compositeCondition = new AndCondition();
}
else if (data.hasOwnProperty('OrCondition')) {
compositeConditionJSON = data.OrCondition;
compositeCondition = new OrCondition();
}
else if (data.hasOwnProperty('NotCondition')) {
compositeConditionJSON = data.NotCondition;
compositeCondition = new NotCondition();
}
// if (data.hasOwnProperty('IsRelevant')){
// compositeConditionJSON += data.IsRelevant;
// }
if (!this.isComposite(compositeConditionJSON)) {
compositeCondition.conditions = this.returnConditions(compositeConditionJSON);
}
else if (this.isHybrid(compositeConditionJSON)) {
const /** @type {?} */ jsonKeys = Object.keys(compositeConditionJSON);
for (const /** @type {?} */ jsonKey of jsonKeys) {
const /** @type {?} */ jsonValue = compositeConditionJSON[jsonKey];
const /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
const /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, compositeCondition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
for (const /** @type {?} */ arrayValue of jsonValue) {
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
else {
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
else {
this.returnInnerConditions(compositeConditionJSON, compositeCondition);
}
return compositeCondition;
}
/**
* @param {?} elementName
* @return {?}
*/
returnCompositeConditionFromName(elementName) {
let /** @type {?} */ compositeCondition;
switch (elementName) {
case 'AndCondition':
{
compositeCondition = new AndCondition();
break;
}
case 'OrCondition':
{
compositeCondition = new OrCondition();
break;
}
case 'NotCondition':
{
compositeCondition = new NotCondition();
}
}
return compositeCondition;
}
/**
* @param {?} key
* @param {?} value
* @param {?} compositeCondition
* @return {?}
*/
addConditionsToInnerConditions(key, value, compositeCondition) {
const /** @type {?} */ condition = this.returnCompositeConditionFromName(key);
compositeCondition.conditions.push(condition);
if (this.isHybrid(value)) {
const /** @type {?} */ jsonKeys = Object.keys(value);
for (const /** @type {?} */ jsonKey of jsonKeys) {
const /** @type {?} */ jsonValue = value[jsonKey];
const /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
const /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, condition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
for (const /** @type {?} */ arrayValue of jsonValue) {
condition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
else {
condition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
else if (this.isComposite(value)) {
// console.log( 'isComposite');
}
else {
condition.conditions = this.returnConditions(value);
}
}
/**
* @param {?} innerConditionsJSON
* @param {?} compositeCondition
* @return {?}
*/
returnInnerConditions(innerConditionsJSON, compositeCondition) {
const /** @type {?} */ jsonKeys = Object.keys(innerConditionsJSON);
for (const /** @type {?} */ key of jsonKeys) {
const /** @type {?} */ values = innerConditionsJSON[key];
if (this.arrayCheckerService.isArray(values)) {
for (const /** @type {?} */ value of values) {
this.addConditionsToInnerConditions(key, value, compositeCondition);
}
}
else {
this.addConditionsToInnerConditions(key, innerConditionsJSON[key], compositeCondition);
}
}
}
}
ConditionsCreationService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
ConditionsCreationService.ctorParameters = () => [
{ type: ArrayCheckerService }
];
function ConditionsCreationService_tsickle_Closure_declarations() {
/** @type {?} */
ConditionsCreationService.prototype.arrayCheckerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNwRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdqRSxNQUFNOzs7O0lBSUgsWUFBcUIsbUJBQXdDO1FBQXhDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7S0FBSzs7Ozs7SUFFekQsbUJBQW1CLENBQUMsYUFBa0I7UUFDNUMsdUJBQU0sYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDMUMsYUFB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Q3pCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7aUJBQ3ZFO2FBQ0g7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDeEY7U0FDRjs7OztZQW5PWixVQUFVOzs7O1lBSEYsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IEVxdWFsQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9lcXVhbC1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvY29uZGl0aW9udHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IEdyZWF0ZXJUaGFuQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ncmVhdGVyLXRoYW4tY29uZGl0aW9uJztcclxuaW1wb3J0IHsgTGVzc1RoYW5Db25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2xlc3MtdGhhbi1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ncmVhdGVyLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IExlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2xlc3MtdGhhbi1vci1lcXVhbHMtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29udGFpbnNDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2NvbnRhaW5zLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbXBvc2l0ZUNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9zaXRlLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IEFuZENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvYW5kLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IE9yQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9vci1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcnJheS1jaGVja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL25vdC1jb25kaXRpb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB7XHJcblxyXG5cclxuXHJcbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UpIHsgfVxyXG5cclxuICAgIHByaXZhdGUgcmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OOiBhbnkpOiBDb25kaXRpb25UeXBlIHtcclxuICAgICAgY29uc3QgY29uZGl0aW9uVHlwZSA9IG5ldyBDb25kaXRpb25UeXBlKCk7XHJcbiAgICAgIGNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlID0gY29uZGl0aW9uSlNPTi5BdHRyLkNvbXBhcmlzb25WYWx1ZTtcclxuICAgICAgY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkID0gY29uZGl0aW9uSlNPTi5BdHRyLkRhdGFFbGVtZW50SWQ7XHJcbiAgICAgIHJldHVybiBjb25kaXRpb25UeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkNvbmRpdGlvbihicmFuY2hKU09OOiBhbnkpOiBDb25kaXRpb24ge1xyXG4gICAgICAgIGxldCBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnRXF1YWxDb25kaXRpb24nKSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBuZXcgRXF1YWxDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uRXF1YWxDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5HcmVhdGVyVGhhbkNvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5Db25kaXRpb24nKSkge1xyXG4gICAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkxlc3NUaGFuQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkdyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24nKSkge1xyXG4gICAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnQ29udGFpbnNDb25kaXRpb24nKSkge1xyXG4gICAgICAgICAgY29uZGl0aW9uID0gbmV3IENvbnRhaW5zQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkNvbnRhaW5zQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAoY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIGNvbmRpdGlvbi5Jc1JlbGV2YW50ID0gYnJhbmNoSlNPTi5Jc1JlbGV2YW50ICE9PSB1bmRlZmluZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBicmFuY2hKU09OLklzUmVsZXZhbnQgOiBmYWxzZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gY29uZGl0aW9uLklzUmVsZXZhbnQgPSBicmFuY2hKU09OLklzUmVsZXZhbnQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJhbmNoSlNPTi5Jc1JlbGV2YW50IDogdHJ1ZTtcclxuICAgICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgICBpc0NvbXBvc2l0ZShjb21wb3NpdGVFbGVtZW50SlNPTik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgfHxcclxuICAgICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSB8fFxyXG4gICAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdOb3RDb25kaXRpb24nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXI6IHN0cmluZyAsIGNvbmRpdGlvbkpTT046IGFueSk6IENvbmRpdGlvbiB7XHJcbiAgICAgIGxldCBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdFcXVhbENvbmRpdGlvbicpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBFcXVhbENvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnR3JlYXRlclRoYW5Db25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IEdyZWF0ZXJUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdMZXNzVGhhbkNvbmRpdGlvbicpIHtcclxuICAgICAgICBjb25kaXRpb24gPSBuZXcgTGVzc1RoYW5Db25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IEdyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0xlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0NvbnRhaW5zQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb250YWluc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb25kaXRpb247XHJcbiAgfVxyXG5cclxuICAgIHByaXZhdGUgIHJldHVybkNvbmRpdGlvbnMoY29uZGl0aW9uc0pTT046IEpTT04pOiBDb25kaXRpb25bXSB7XHJcbiAgICAgICAgIGxldCBjb25kaXRpb25zOiBDb25kaXRpb25bXTtcclxuICAgICAgICBjb25zdCBjb25kaXRpb25JZGVudGlmaWVycyA9IFsnRXF1YWxDb25kaXRpb24nLCAnR3JlYXRlclRoYW5Db25kaXRpb24nLCAnTGVzc1RoYW5Db25kaXRpb24nLFxyXG4gICAgICAgICAgICAnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicsICdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJywgJ0NvbnRhaW5zQ29uZGl0aW9uJ107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb25JZGVudGlmaWVyIG9mIGNvbmRpdGlvbklkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uSlNPTiA9IGNvbmRpdGlvbnNKU09OW2NvbmRpdGlvbklkZW50aWZpZXJdO1xyXG4gICAgICAgICAgICAgIGlmIChjb25kaXRpb25KU09OICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBuZXcgQXJyYXk8Q29uZGl0aW9uPigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGNvbmRpdGlvbkpTT04pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGpzb25WYWx1ZSBvZiBjb25kaXRpb25KU09OKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXIsIGpzb25WYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oY29uZGl0aW9uSWRlbnRpZmllciwgY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgaXNIeWJyaWQoY29tcG9zaXRlRWxlbWVudEpTT04pOiBib29sZWFuIHtcclxuICAgICAgY29uc3QgY29tcG9zaXRlRXhpc3RzID0gIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdBbmRDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJyk7XHJcblxyXG4gICAgICBjb25zdCBwcmltaXRpdmVFeGlzdHMgPSBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnRXF1YWxDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5Db25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5Db25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicpIHx8XHJcbiAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0NvbnRhaW5zQ29uZGl0aW9uJyk7XHJcbiAgICAgIHJldHVybiAgY29tcG9zaXRlRXhpc3RzICYmIHByaW1pdGl2ZUV4aXN0cztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uKGRhdGE6IGFueSk6IENvbXBvc2l0ZUNvbmRpdGlvbiB7XHJcbiAgICAgIGlmICghdGhpcy5pc0NvbXBvc2l0ZShkYXRhKSkgIHtcclxuICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb21wb3NpdGVDb25kaXRpb25KU09OOiBhbnk7XHJcbiAgICAgIGxldCBjb21wb3NpdGVDb25kaXRpb246IENvbXBvc2l0ZUNvbmRpdGlvbjtcclxuXHJcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdBbmRDb25kaXRpb24nKSApIHtcclxuICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gPSBkYXRhLkFuZENvbmRpdGlvbjtcclxuICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBBbmRDb25kaXRpb24oKTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdPckNvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gPSBkYXRhLk9yQ29uZGl0aW9uO1xyXG4gICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgT3JDb25kaXRpb24oKTtcclxuICAgICAgIH0gZWxzZSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJykpIHtcclxuICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5Ob3RDb25kaXRpb247XHJcbiAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE5vdENvbmRpdGlvbigpO1xyXG4gICAgIH1cclxuLy8gaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ0lzUmVsZXZhbnQnKSl7XHJcbi8vICAgY29tcG9zaXRlQ29uZGl0aW9uSlNPTiArPSBkYXRhLklzUmVsZXZhbnQ7XHJcbi8vIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0NvbXBvc2l0ZShjb21wb3NpdGVDb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucyA9IHRoaXMucmV0dXJuQ29uZGl0aW9ucyhjb21wb3NpdGVDb25kaXRpb25KU09OKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSHlicmlkKGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04pKSB7XHJcbiAgICAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyhjb21wb3NpdGVDb25kaXRpb25KU09OKTtcclxuICAgICAgICAgZm9yIChjb25zdCBqc29uS2V5IG9mIGpzb25LZXlzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QganNvblZhbHVlID0gIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT05banNvbktleV07XHJcbiAgICAgICAgICAgICAgY29uc3QganNvblN0cmluZyA9ICAne1wiJyArIGpzb25LZXkgICsgJ1wiOicgKyBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUpICsgJ30nIDtcclxuICAgICAgICAgICAgICBjb25zdCBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvc2l0ZShqc29uT2JqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGpzb25PYmplY3QsIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGpzb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJyYXlWYWx1ZSBvZiAganNvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBhcnJheVZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgdGhpcy5yZXR1cm5Jbm5lckNvbmRpdGlvbnMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTiwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgfVxyXG4gICAgIHJldHVybiBjb21wb3NpdGVDb25kaXRpb247XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbkZyb21OYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBDb21wb3NpdGVDb25kaXRpb24ge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcbiAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgICdBbmRDb25kaXRpb24nOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBBbmRDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAgJ09yQ29uZGl0aW9uJzpcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgT3JDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnTm90Q29uZGl0aW9uJyA6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE5vdENvbmRpdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlQ29uZGl0aW9uO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSAgYWRkQ29uZGl0aW9uc1RvSW5uZXJDb25kaXRpb25zKGtleTogYW55ICwgdmFsdWU6IGFueSwgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb24pIHtcclxuXHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMucmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uRnJvbU5hbWUoa2V5KTtcclxuICAgICAgY29tcG9zaXRlQ29uZGl0aW9uLmNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5pc0h5YnJpZCh2YWx1ZSkpIHtcclxuICAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBqc29uS2V5IG9mIGpzb25LZXlzKSB7XHJcbiAgICAgICAgICAgICBjb25zdCBqc29uVmFsdWUgPSAgdmFsdWVbanNvbktleV07XHJcbiAgICAgICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gICd7XCInICsganNvbktleSAgKyAnXCI6JyArIEpTT04uc3RyaW5naWZ5KGpzb25WYWx1ZSkgKyAnfScgO1xyXG4gICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcbiAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvc2l0ZShqc29uT2JqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5Jbm5lckNvbmRpdGlvbnMoanNvbk9iamVjdCwgY29uZGl0aW9uKTtcclxuICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGpzb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcnJheVZhbHVlIG9mICBqc29uVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBhcnJheVZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLmNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGpzb25LZXksIGpzb25WYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gZWxzZSAgaWYgKHRoaXMuaXNDb21wb3NpdGUodmFsdWUpKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coICdpc0NvbXBvc2l0ZScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uZGl0aW9uLmNvbmRpdGlvbnMgPSB0aGlzLnJldHVybkNvbmRpdGlvbnModmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmV0dXJuSW5uZXJDb25kaXRpb25zKGlubmVyQ29uZGl0aW9uc0pTT046IGFueSwgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb24pIHtcclxuICAgICAgICBjb25zdCBqc29uS2V5cyA9IE9iamVjdC5rZXlzKGlubmVyQ29uZGl0aW9uc0pTT04pO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGpzb25LZXlzICkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBpbm5lckNvbmRpdGlvbnNKU09OW2tleV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXksIHZhbHVlLCBjb21wb3NpdGVDb25kaXRpb24pO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXksIGlubmVyQ29uZGl0aW9uc0pTT05ba2V5XSwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4iXX0=