acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
281 lines (280 loc) • 36.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input } from '@angular/core';
import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model';
import { DomSanitizer } from '@angular/platform-browser';
var ImageMapComponent = /** @class */ (function () {
function ImageMapComponent(domSanitizer) {
this.$ = require('jquery');
this.DataElements = {};
this.FormValues = {};
this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
this.imageExist = true;
this.SelectionValue = '';
this.domSanitizer = domSanitizer;
}
/**
* @return {?}
*/
ImageMapComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.DataElement === undefined) {
return;
}
this.displayValue('');
};
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInRectangle = /**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
function (mouseX, mouseY, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
if (COArray[0] < mouseX
&& (COArray[0] + COArray[2]) > mouseX
&& COArray[1] < mouseY
&& (COArray[1] + COArray[3]) > mouseY) {
return true;
}
return false;
};
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInCircle = /**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
function (mouseX, mouseY, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
if (Math.sqrt(Math.pow((mouseX - COArray[0]), 2) + Math.pow((mouseY - COArray[1]), 2)) < COArray[2]) {
return true;
}
else {
return false;
}
};
/**
* @param {?} x
* @param {?} y
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInPolygon = /**
* @param {?} x
* @param {?} y
* @param {?} Coordinates
* @return {?}
*/
function (x, y, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
var /** @type {?} */ vs = [];
for (var /** @type {?} */ i = 0; i < COArray.length; i++) {
var /** @type {?} */ point = [];
point.push(COArray[i]);
point.push(COArray[i + 1]);
i += 1;
vs.push(point);
}
var /** @type {?} */ inside = false;
for (var /** @type {?} */ i = 0, /** @type {?} */ j = vs.length - 1; i < vs.length; j = i++) {
var /** @type {?} */ xi = vs[i][0], /** @type {?} */ yi = vs[i][1];
var /** @type {?} */ xj = vs[j][0], /** @type {?} */ yj = vs[j][1];
var /** @type {?} */ intersect = ((yi > y) !== (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) {
inside = !inside;
}
}
return inside;
};
/**
* @param {?} e
* @param {?} dataElement
* @return {?}
*/
ImageMapComponent.prototype.imageClick = /**
* @param {?} e
* @param {?} dataElement
* @return {?}
*/
function (e, dataElement) {
var /** @type {?} */ O_height = dataElement.ImageProp.height;
var /** @type {?} */ O_width = dataElement.ImageProp.width;
var /** @type {?} */ $elem = this.$(e.target);
var /** @type {?} */ N_height = $elem.height();
var /** @type {?} */ N_width = $elem.width();
var /** @type {?} */ offset = $elem.offset();
var /** @type {?} */ offset_t = offset.top - this.$(window).scrollTop();
var /** @type {?} */ offset_l = offset.left - this.$(window).scrollLeft();
var /** @type {?} */ x = e.clientX - offset_l;
var /** @type {?} */ y = e.clientY - offset_t;
try {
for (var _a = tslib_1.__values(dataElement.ImageOptions), _b = _a.next(); !_b.done; _b = _a.next()) {
var opt = _b.value;
if (opt.Shape === 'rect') {
if (this.isInRectangle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'circle') {
if (this.isInCircle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'poly') {
if (this.isInPolygon(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
var e_1, _c;
};
/**
* @param {?} val
* @return {?}
*/
ImageMapComponent.prototype.setValue = /**
* @param {?} val
* @return {?}
*/
function (val) {
try {
for (var _a = tslib_1.__values(this.DataElement.choiceInfo), _b = _a.next(); !_b.done; _b = _a.next()) {
var optValue = _b.value;
if (this.DataElement.choiceInfo.length <= 5 && this.DataElement.choiceInfo.length > 0) {
if (optValue.value === val) {
this.$('#' + val + '_' + this.DataElement.id).prop('checked', true);
var /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + val + '_' + this.DataElement.id)[0].dispatchEvent(customEvent);
}
else {
this.$('#' + optValue.value + '_' + this.DataElement.id).prop('checked', false);
}
}
else {
if (optValue.value === val) {
this.$('#' + this.DataElement.id).val(optValue.value);
var /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + this.DataElement.id)[0].dispatchEvent(customEvent);
break;
}
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_2) throw e_2.error; }
}
this.DataElement.currentValue = val;
// this.FormValues[this.DataElement.id] = val;
var e_2, _c;
};
/**
* @param {?} val
* @return {?}
*/
ImageMapComponent.prototype.displayValue = /**
* @param {?} val
* @return {?}
*/
function (val) {
if (val === '') {
this.SelectionValue = 'Image Map Diagram';
}
else {
this.SelectionValue = 'Selected Value : ' + val;
}
};
/**
* @param {?} location
* @return {?}
*/
ImageMapComponent.prototype.getImageDataUrl = /**
* @param {?} location
* @return {?}
*/
function (location) {
var /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
if (isDataURL) {
location = location.replace('unsafe:', '');
return location;
}
else {
return this.imagePath + '/' + location;
}
};
ImageMapComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-image-map',
template: "<div class=\"col-sm-8\">\n <label class=\"control-label font-weight-400\">Not sure? try out this image </label>\n <button type=\"button\" class=\"btn btn-default\" data-toggle=\"modal\" attr.data-target=\"#{{'imgMap_Modal_'+DataElement.id}}\">\n <span class=\"glyphicon glyphicon-picture\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Image Map\"></span>\n </button>\n</div>\n<ng-container *ngIf=\"imagePath != undefined\">\n <div class=\"modal inmodal fade\" id=\"{{'imgMap_Modal_'+DataElement.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n <span aria-hidden=\"true\">×</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <h4 class=\"modal-title\"> {{SelectionValue}}</h4>\n </div>\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <ng-container *ngIf=\"imageExist == true\">\n <img class=\"ImgOption danger img-responsive max-w-h-100\" alt=\"{{ DataElement.imageMap.label }}\" data-dismiss=\"modal\" attr.id=\"{{'imgMap_Img_'+DataElement.id}}\"\n (click)=\"imageClick($event,DataElement);\" attr.data-elementID=\"{{DataElement.id}}\" attr.usemap=\"#{{'imgMap_'+DataElement.id}}\"\n [src]=\"domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(DataElement.imageMap.location))\">\n <map name=\"{{'imgMap_'+DataElement.id}}\">\n <ng-container *ngFor=\"let imgOpt of DataElement.imageMap.map.areas\">\n <area attr.shape=\"{{imgOpt.shape}}\" attr.imgID=\"{{'imgMap_Img_'+DataElement.id}}\" attr.coords=\"{{imgOpt.coords}}\"\n attr.alt=\"{{imgOpt.choiceValue}}\" (mouseover)='displayValue(imgOpt.choiceValue);' (mouseout)='displayValue(\"\");'\n (click)=\"setValue(imgOpt.choiceValue);\" data-dismiss=\"modal\">\n </ng-container>\n </map>\n </ng-container>\n <ng-container *ngIf=\"imageExist == false\">\n <div class=\"\">\n No Image Map Available...\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n",
styles: ["", ".required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}"]
},] },
];
/** @nocollapse */
ImageMapComponent.ctorParameters = function () { return [
{ type: DomSanitizer }
]; };
ImageMapComponent.propDecorators = {
DataElement: [{ type: Input }],
DataElements: [{ type: Input }],
FormValues: [{ type: Input }],
imagePath: [{ type: Input }]
};
return ImageMapComponent;
}());
export { ImageMapComponent };
function ImageMapComponent_tsickle_Closure_declarations() {
/** @type {?} */
ImageMapComponent.prototype.$;
/** @type {?} */
ImageMapComponent.prototype.DataElement;
/** @type {?} */
ImageMapComponent.prototype.DataElements;
/** @type {?} */
ImageMapComponent.prototype.FormValues;
/** @type {?} */
ImageMapComponent.prototype.imagePath;
/** @type {?} */
ImageMapComponent.prototype.isDataURL;
/** @type {?} */
ImageMapComponent.prototype.domSanitizer;
/** @type {?} */
ImageMapComponent.prototype.imageExist;
/** @type {?} */
ImageMapComponent.prototype.SelectionValue;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2ltYWdlLW1hcC9pbWFnZS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOztJQW9FckQsMkJBQVksWUFBMEI7aUJBVmxDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBRVcsRUFBRTswQkFDSixFQUFFO3lCQUVwQix1SEFBdUg7MEJBRXRILElBQUk7OEJBQ0EsRUFBRTtRQUdmLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0tBQ3BDOzs7O0lBRUQsb0NBQVE7OztJQUFSO1FBRUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN6Qjs7Ozs7OztJQUVELHlDQUFhOzs7Ozs7SUFBYixVQUFjLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVztRQUNyQyxxQkFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTTtlQUNoQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNO2VBQ2xD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N0MsQ0FBQztpQkFDajhDOzs7O2dCQXZEUSxZQUFZOzs7OEJBMkRoQixLQUFLOytCQUNMLEtBQUs7NkJBQ0wsS0FBSzs0QkFDTCxLQUFLOzs0QkFqRVY7O1NBNERhLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0ICwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItaW1hZ2UtbWFwJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgZm9udC13ZWlnaHQtNDAwXCI+Tm90IHN1cmU/IHRyeSBvdXQgdGhpcyBpbWFnZSA8L2xhYmVsPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGF0dHIuZGF0YS10YXJnZXQ9XCIje3snaW1nTWFwX01vZGFsXycrRGF0YUVsZW1lbnQuaWR9fVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXBpY3R1cmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInRvcFwiIHRpdGxlPVwiSW1hZ2UgTWFwXCI+PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgaW5tb2RhbCBmYWRlXCIgaWQ9XCJ7eydpbWdNYXBfTW9kYWxfJytEYXRhRWxlbWVudC5pZH19XCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+IHt7U2VsZWN0aW9uVmFsdWV9fTwvaDQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZUV4aXN0ID09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIkltZ09wdGlvbiBkYW5nZXIgaW1nLXJlc3BvbnNpdmUgbWF4LXctaC0xMDBcIiBhbHQ9XCJ7eyBEYXRhRWxlbWVudC5pbWFnZU1hcC5sYWJlbCB9fVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXR0ci5pZD1cInt7J2ltZ01hcF9JbWdfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW1hZ2VDbGljaygkZXZlbnQsRGF0YUVsZW1lbnQpO1wiIGF0dHIuZGF0YS1lbGVtZW50SUQ9XCJ7e0RhdGFFbGVtZW50LmlkfX1cIiBhdHRyLnVzZW1hcD1cIiN7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGdldEltYWdlRGF0YVVybChEYXRhRWxlbWVudC5pbWFnZU1hcC5sb2NhdGlvbikpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWFwIG5hbWU9XCJ7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZ09wdCBvZiBEYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXJlYSBhdHRyLnNoYXBlPVwie3tpbWdPcHQuc2hhcGV9fVwiIGF0dHIuaW1nSUQ9XCJ7eydpbWdNYXBfSW1nXycrRGF0YUVsZW1lbnQuaWR9fVwiIGF0dHIuY29vcmRzPVwie3tpbWdPcHQuY29vcmRzfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ci5hbHQ9XCJ7e2ltZ09wdC5jaG9pY2VWYWx1ZX19XCIgKG1vdXNlb3Zlcik9J2Rpc3BsYXlWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpOycgKG1vdXNlb3V0KT0nZGlzcGxheVZhbHVlKFwiXCIpOydcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpO1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXA+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlRXhpc3QgPT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgTm8gSW1hZ2UgTWFwIEF2YWlsYWJsZS4uLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW1hZ2VNYXBDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50OiBDaG9pY2VEYXRhRWxlbWVudDtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50czogT2JqZWN0ID0ge307XHJcbiAgICBASW5wdXQoKSBGb3JtVmFsdWVzOiBPYmplY3QgPSB7fTtcclxuICAgIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gICAgaXNEYXRhVVJMID0gL15cXHMqZGF0YTooW2Etel0rXFwvW2Etel0rKDtbYS16XFwtXStcXD1bYS16XFwtXSspPyk/KDtiYXNlNjQpPyxbYS16MC05XFwhXFwkXFwmXFwnXFwsXFwoXFwpXFwqXFwrXFwsXFw7XFw9XFwtXFwuXFxfXFx+XFw6XFxAXFwvXFw/XFwlXFxzXSpcXHMqJC9pO1xyXG4gICAgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcbiAgICBpbWFnZUV4aXN0ID0gdHJ1ZTtcclxuICAgIFNlbGVjdGlvblZhbHVlID0gJyc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICAgICAgICB0aGlzLmRvbVNhbml0aXplciA9IGRvbVNhbml0aXplcjtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0luUmVjdGFuZ2xlKG1vdXNlWCwgbW91c2VZLCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChDT0FycmF5WzBdIDwgbW91c2VYXHJcbiAgICAgICAgICAgICYmIChDT0FycmF5WzBdICsgQ09BcnJheVsyXSkgPiBtb3VzZVhcclxuICAgICAgICAgICAgJiYgQ09BcnJheVsxXSA8IG1vdXNlWVxyXG4gICAgICAgICAgICAmJiAoQ09BcnJheVsxXSArIENPQXJyYXlbM10pID4gbW91c2VZKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJbkNpcmNsZShtb3VzZVgsIG1vdXNlWSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoTWF0aC5zcXJ0KE1hdGgucG93KChtb3VzZVggLSBDT0FycmF5WzBdKSwgMikgKyBNYXRoLnBvdygobW91c2VZIC0gQ09BcnJheVsxXSksIDIpKSA8IENPQXJyYXlbMl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0luUG9seWdvbih4LCB5LCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGNvbnN0IHZzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gW107XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpXSk7XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpICsgMV0pO1xyXG4gICAgICAgICAgICBpICs9IDE7XHJcbiAgICAgICAgICAgIHZzLnB1c2gocG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSB2cy5sZW5ndGggLSAxOyBpIDwgdnMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHhpID0gdnNbaV1bMF0sIHlpID0gdnNbaV1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IHhqID0gdnNbal1bMF0sIHlqID0gdnNbal1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAmJiAoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgaW1hZ2VDbGljayhlLCBkYXRhRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IE9faGVpZ2h0ID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLmhlaWdodDtcclxuICAgICAgICBjb25zdCBPX3dpZHRoID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLndpZHRoO1xyXG4gICAgICAgIGNvbnN0ICRlbGVtID0gdGhpcy4kKGUudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgY29uc3QgTl9oZWlnaHQgPSAkZWxlbS5oZWlnaHQoKTtcclxuICAgICAgICBjb25zdCBOX3dpZHRoID0gJGVsZW0ud2lkdGgoKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9ICRlbGVtLm9mZnNldCgpO1xyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXRfdCA9IG9mZnNldC50b3AgLSB0aGlzLiQod2luZG93KS5zY3JvbGxUb3AoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRfbCA9IG9mZnNldC5sZWZ0IC0gdGhpcy4kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gZS5jbGllbnRYIC0gb2Zmc2V0X2w7XHJcbiAgICAgICAgY29uc3QgeSA9IGUuY2xpZW50WSAtIG9mZnNldF90O1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0IG9mIGRhdGFFbGVtZW50LkltYWdlT3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAob3B0LlNoYXBlID09PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5SZWN0YW5nbGUoeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LlNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbkNpcmNsZSh4LCB5LCBvcHQuQ29vcmRpbmF0ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmFsdWVzW2RhdGFFbGVtZW50LklEXSA9IG9wdC5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuU2hhcGUgPT09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJblBvbHlnb24oeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZSh2YWwpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdFZhbHVlIG9mIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSA1ICYmIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0VmFsdWUudmFsdWUgPT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIG9wdFZhbHVlLnZhbHVlICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRWYWx1ZS52YWx1ZSA9PT0gdmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIHRoaXMuRGF0YUVsZW1lbnQuaWQpLnZhbChvcHRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkRhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IHZhbDtcclxuICAgICAgICAvLyB0aGlzLkZvcm1WYWx1ZXNbdGhpcy5EYXRhRWxlbWVudC5pZF0gPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheVZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnSW1hZ2UgTWFwIERpYWdyYW0nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnU2VsZWN0ZWQgVmFsdWUgOiAnICsgdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZURhdGFVcmwobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaXNEYXRhVVJMID0gISFsb2NhdGlvbi5tYXRjaCh0aGlzLmlzRGF0YVVSTCk7XHJcbiAgICAgICAgaWYgKGlzRGF0YVVSTCkge1xyXG4gICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgndW5zYWZlOicsICcnKTtcclxuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VQYXRoICsgJy8nICsgbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==