UNPKG

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