

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Panels =
/*#__PURE__*/
function () {
  function Panels() {
    _classCallCheck(this, Panels);

    this.panelsContainer = document.querySelector('.panels');
    this.panels = this.panelsContainer.getElementsByClassName('panel');
    this.listeners();
  }

  _createClass(Panels, [{
    key: "listeners",
    value: function listeners() {
      var count = 0;
      [].forEach.call(this.panels, function (item) {
        var content = item.querySelector('.panel__content');
        var black = item.querySelector('.panel__blackBlock');
        var bg = item.querySelector('.panel__backgroundBlock');
        item.addEventListener('mouseenter', function (event) {
          var animNumber = ++count;
          item.style.zIndex = 2;
          setTimeout(function () {
            if (animNumber !== count) return;
            content && (content.style.display = 'block');
            requestAnimationFrame(function () {
              requestAnimationFrame(function () {
                item.classList.add('panel--active');
              });
            });
          }, 400);
        });
        item.addEventListener('mouseleave', function (event) {
          count++;
          item.classList.remove('panel--active');
          item.style.zIndex = '';
          setTimeout(function () {
            content && (content.style.display = '');
          }, 300);
        });
      });
    }
  }]);

  return Panels;
}();

exports.default = Panels;:root {

	/* @media (--to-desktop) {}
	@media (--to-tablet) {}
	@media (--to-mobile) {} */

}
.siteTitle {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	height: 100vh;
	min-height: 850px;
	max-height: 930px;
	background:rgb(41, 155, 253) url(../images/title.png) 50% 50%/cover no-repeat;

	/* фикс pageNav */
	margin-bottom: 30px;
}
.container__pageNav {
	position: relative;
	-webkit-transition: color .2s ease .2s;
	transition: color .2s ease .2s
}
.container__pageNav.pageNav__opened {
	color: #fff;
	-webkit-transition: color .2s ease;
	transition: color .2s ease;

}
.pageNav {
	padding: 60px 0 40px;
	-webkit-box-shadow: 0px 10px 32px 0 rgba(0, 0, 0, .1);
	        box-shadow: 0px 10px 32px 0 rgba(0, 0, 0, .1);
	margin-bottom: -30px;
	background: #fff;
}
.ie {
	/* класс только для фикса ие */
}
.ie .pageNav--position {
	position: relative;

}
.ie .pageNav__menu {
	left: 0;
	width: calc(100% - 30px);
	margin: 0 15px;

}
.ie .pageNav:hover,
	.ie .pageNav__menu,
	.ie .pageNav__bg {
	background: #0da481;

}
.pageNav__bg {
	position: absolute;
	bottom:0;
	left:0;
	width: 100%;
	z-index: 1;
	margin-bottom: -30px;
  background: linear-gradient(45deg,#0da481 0%,#0da481 30%,#92d061 70%, #92d061 100%);
}
.pageNav__ul {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-pack: distribute;
	    justify-content: space-around;
	margin: 0 15px;
	z-index: 2;
	position: relative;
}
.pageNav__li {
	margin: 10px;
	font-size: 1.25em;
	font-weight: 500;
}
.pageNav__menu {
	position: absolute;
	bottom: 100%;
	z-index: 4
}
.pageNav__menu [data-menu-block-name] {
	display: none;
	max-width: 1260px;
	color:#fff;
	padding: 30px;
	opacity: 0;
	-webkit-transform: translateY(20px);
	        transform: translateY(20px);
	-webkit-transition: all .3s ease .1s;
	transition: all .3s ease .1s;

}
.pageNav__menu [data-menu-block-name] ul {
	-webkit-columns: 2;
	        columns: 2;
	-webkit-column-gap: 50px;
	        column-gap: 50px;

}
.pageNav__menu [data-menu-block-name] ul li {
	padding: 5px 0;

}
.\--active[data-menu-block-name] {
	opacity: 1;
	-webkit-transform: translateY(0px);
	        transform: translateY(0px);
}
.pageNav__indicator {
	position: relative;
	width: 100%;
	height: 1px;
	background: rgba(255, 255, 255, .25);
	top:40px;
	z-index: 2;
}
.pageNav__indicator-slider {
	width: 0;
	height:3px;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;
	position: relative;
	background: #fff;
}
.panels {
	/*width:1230px;*/
	width: 1230px;
	height:1000px;
	position: relative;
	-ms-flex-negative: 0;
	    flex-shrink: 0;
}
.panel {
	position: absolute;
	-webkit-box-shadow: 0px 8px 15px -3px rgba(0, 0, 0, .1);
	        box-shadow: 0px 8px 15px -3px rgba(0, 0, 0, .1);
	background:#fff;
	-webkit-transition: all .56s ease;
	transition: all .56s ease;
}
.panel__content {
	display: none;
	position: relative;
	overflow: hidden;
}
.panel__blackBlock {
	position: absolute;
	width: 0;
	height: 0;
	z-index: 1;
	-webkit-transition: all .4s ease;
	transition: all .4s ease;
	background-color: rgb(0, 0, 0);
	opacity: 0
}
.panel__blackBlock.\--top-left {
	top: 0;
	left: 0;
	border-radius: 0 0 100000px 0;

}
.panel__blackBlock.\--top-right {
	top: 0;
	right: 0;
	border-radius: 0 0 0 100000px;

}
.panel__blackBlock.\--bottom-left {
	bottom: 0;
	left: 0;
	border-radius: 0 100000px 0 0;

}
.panel__blackBlock.\--bottom-right {
	bottom: 0;
	right: 0;
	border-radius: 100000px 0 0 0;

}
.panel__backgroundBlock {
	position: absolute;
	width: 100%;
	height: 100%;
	z-index: 0;
	opacity: 0;
	-webkit-transition: opacity .4s ease .1s;
	transition: opacity .4s ease .1s;
}
.panel__texts {
	position: relative;
	z-index: 2;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;
	height: 100%;
	opacity: 0;
	-webkit-transform: translateY(20px);
	        transform: translateY(20px);
	-webkit-transition: all .13s ease;
	transition: all .13s ease;
	color: #fff;
	padding: 30px
}
.panel__texts .blockName {
	margin: .25em 0;

}
.panel__texts p {
	font-size: .875em;
	margin: .25em 0;

}
.panel__texts hr {
	height: 1px;
	background: #fff;
	width: 100%;
	border: none;
	opacity: .4;

}
.panel--active .panel__backgroundBlock {
	opacity: 1;

}
.panel--active .panel__blackBlock {
	opacity: .7;
	width:150%;
	height:150%;

}
.panel--active .panel__blackBlock.\--bottom {
	opacity: .7;
	width:150%;
	height:150%;

}
.panel--active .panel__texts {
	opacity: 1;
	-webkit-transform: translateY(0);
	        transform: translateY(0);
	-webkit-transition: all .13s ease .3s;
	transition: all .13s ease .3s;

}
.panel__content:hover .panel__blackBlock {}
.left-x-4 {
	left:-411.66668px;
}
.left-x-3 {
	left:-308.75001px;
}
.left-x-2 {
	left:-205.83334px;
}
.left-x-1 {
	left:-102.91667px;
}
.left-x0 {
	left:0;
}
.left-x1 {
	left:102.91667px;
}
.left-x2 {
	left:205.83334px;
}
.left-x3 {
	left:308.75001px;
}
.left-x4 {
	left:411.66668px;
}
.left-x5 {
	left:514.58335px;
}
.left-x6 {
	left:617.50002px;
}
.left-x7 {
	left:720.41669px;
}
.left-x8 {
	left:823.33336px;
}
.left-x9 {
	left:926.25003px;
}
.left-x10 {
	left:1029.1667px;
}
.left-x11 {
	left:1132.08337px;
}
.top-x-4 {
	top:-411.66668px;
}
.top-x-3 {
	top:-308.75001px;
}
.top-x-2 {
	top:-205.83334px;
}
.top-x-1 {
	top:-102.91667px;
}
.top-x0 {
	top:0;
}
.top-x1 {
	top:102.91667px;
}
.top-x2 {
	top:205.83334px;
}
.top-x3 {
	top:308.75001px;
}
.top-x4 {
	top:411.66668px;
}
.width-x1 {
	width:97.91667px;
}
.width-x2 {
	width:200.83334px;
}
.width-x3 {
	width:303.75001px;
}
.width-x4 {
	width:406.66668px;
}
.width-x5 {
	width:509.58335px;
}
.width-x6 {
	width:612.50002px;
}
.height-x1 {
	height:97.91667px;
}
.height-x2 {
	height:200.83334px;
}
.height-x3 {
	height:303.75001px;
}
.height-x4 {
	height:406.66668px;
}
.height-x5 {
	height:509.58335px;
}
.height-x6 {
	height:612.50002px;
}
.panels.height-x1 {
	height:107.91667px;
}
.panels.height-x2 {
	height:210.83334px;
}
.panels.height-x3 {
	height:313.75001px;
}
.panels.height-x4 {
	height:416.66668px;
}
.panels.height-x5 {
	height:519.58335px;
}
.panels.height-x6 {
	height:622.50002px;
}
.benifits {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	padding-bottom: 7px;
}
.benifit {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	color: #fff;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
}
.benifit__text {
	font-weight: 900;
	font-size: 1.125em;

	background: -webkit-gradient(linear, left bottom, left top, from(currentColor), to(currentColor)) bottom left no-repeat;

	background: linear-gradient(0deg, currentColor, currentColor) bottom left no-repeat;
	background-size: 0px 1px;
	-webkit-transition: background-size 0.3s ease;
	transition: background-size 0.3s ease;
}
.benifit__image svg {
	height: 70px;
	fill: currentColor;

}
.benifit--events .benifit__image {
	padding-left: 14px;

}
.benifit--events:hover .benifit__text {
	background-size: 100% 1px;

}
.panelContent {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 100vh;
	/* align-items: center; */
	background-position: right bottom;
	background-repeat: no-repeat;
	background-size: auto 75%;
}
.panelContent_group {
	margin-top: 100px;
	width: 38%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	overflow: hidden;
	/* overflow-y: auto; */
}
.panelContent_wrap {
	/* для скрола контента */
}
.panelContent_group.panelContent_group--large {
	width: auto;
}
.panelContent_title {
	margin: 20px 0;
	font-size: 60px;
	font-weight: 500;
	line-height: 1;
	color: #fff;
}
.panelContent_subTitle {
	margin: 20px 0;
	font-size: 16px;
	font-weight: 400;
	line-height: 1.5;
	color: #fff;

}
.panelContent_description {
	margin: 20px 0;
	font-size: 20px;
	font-weight: 500;
	line-height: 1.65;
	color: #fff;
}
.panelContent_more {
	margin-top: 30px;
	color: #fff
}
.panelContent_more a {
	color: #ffea00;

}
.panel__bg {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;
	padding: 12px;
  background: linear-gradient(45deg,#0da481 0%,#0da481 30%,#92d061 70%, #92d061 100%)
}
.panel__bg:hover .panel__icon {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.panel__bg:hover .panel__title span {
	background-size: 100% 1px;

}
.panel__icon {
	width: 80px;
	height: 80px;
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease
}
.panel__icon svg {
	width: 80px;
	height: 80px;

}
.panel__title {
	color: #fff;
	font-size: 16px;
	font-weight: 500;
	line-height: 1.4
}
.panel__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.panelsMobile {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  padding: 0 10px 20px
}
.panelsMobile .panel {
	-ms-flex-preferred-size: 30%;
	    flex-basis: 30%;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	margin: 5px;
	padding: 25px;
	position: static;

}
.panelsMobile .panel__icon {
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none;
	width: 55px;
	height: 55px;
	margin-bottom: 20px;
	position: static;

}
@media (max-width: 478px) {
	.mobile .panelsMobile .panel {
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		padding: 20px;

	}
	.mobile .panelsMobile .panel__icon {
		width: 50px;
		height: 50px;
		margin: 0;
		margin-right: 20px;

	}

}
[data-ball-click] > div {
	width: 100vw;
	height: 100vh;
	position:relative;
	left:0;
	top:0;
}
[data-ball-click] {
	position: fixed;
	overflow:hidden;
	left: 0;
	top:0;
	display:none;
	border-radius: 10000px;
	z-index: 10;
}
[data-ball-click] .container {
	position: relative;
}
[data-ball-close] {
	color:#fff;
	position: absolute;
	right: 15px;
	top: 120px;
	z-index: 100;
	width: 40px;
	height: 40px;
	border-radius: 100px;
	border: 3px solid currentColor;
	-webkit-transition: color .12s ease;
	transition: color .12s ease;
	cursor: pointer
}
[data-ball-close]:hover {
	color: rgba(255, 255, 255, .7);

}
[data-ball-close]:before,
	[data-ball-close]:after {
	content:'';
	width: calc(100% - 12px);
	height: 3px;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	margin: auto;
	background: currentColor;

}
[data-ball-close]:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
[data-ball-close]:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
[data-ball-click] .video {
	height: 100%;
	width: 100%;
	position: absolute;
	top: 0;
	left: 0;
	-o-object-fit: cover;
	   object-fit: cover;
}
[data-ball-click] .video__progress {
	z-index: 100;
	position: fixed;
	bottom: 0;
	height: 10px;
	background: #fff;
	width: 100%;
	cursor: pointer;
}
[data-ball-click] .video__progress-actual {
	height:100%;
	position: relative;
	background: #ffae00;
	width:0%;
}
[data-ball-click] .video__controls {
	position: absolute;
	bottom: 15px;
	right: 15px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center
}
[data-ball-click] .video__controls > * {
	margin: 10px;
	cursor: pointer;
	opacity: .7;
	-webkit-transition: opacity .19s ease;
	transition: opacity .19s ease;

}
[data-ball-click] .video__controls > *:hover {
	opacity: 1;

}
[data-ball-click] .video__stop {
	width: 30px;
	height: 30px;
	background: url(../images/icon-pause1.svg) 50% 50%/contain no-repeat
}
[data-ball-click] .video__stop.video__stop--stopped {
	background: url(../images/icon-play1.svg) 50% 50%/contain no-repeat;

}
[data-ball-click] .video__mute {
  position: relative;
	width: 30px;
	height: 30px;
	background: url(../images/icon-mute1.svg) 50% 50%/contain no-repeat
}
[data-ball-click] .video__mute:after {
	content:'';
	width:0%;
	height: 1px;
	background: #fff;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom: 0;
	margin: auto;
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);
	-webkit-transition: all .3s ease;
	transition: all .3s ease;

}
[data-ball-click] .video__mute.video__mute--muted {
	opacity: 1;

}
[data-ball-click] .video__mute.video__mute--muted:after {
	width: 120%;

}
[data-ball-click] .video__time {
	color: #fff
}
[data-ball-click] .video__time .video__actualTime-minutes,
	[data-ball-click] .video__time .video__actualTime-seconds,
	[data-ball-click] .video__time .video__fullTime-minutes,
	[data-ball-click] .video__time .video__fullTime-seconds {
	width: 21px;
	display: inline-block;

}
.categories {
	height: 520px;
	margin-top: 120px;
	margin-bottom: 80px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	position: relative;
}
.categories__image {
	width: calc(33.33333% - 15px);
	z-index: 4;
	height: 100%;
	/* background: url(../../images/nano.jpg) 50% 50%/cover no-repeat; */
	-webkit-box-shadow: 0 10px 32px 0 rgba(0, 0, 0, .25);
	        box-shadow: 0 10px 32px 0 rgba(0, 0, 0, .25);
}
.categories__cardsContainer {
	position: relative;
	height:100%;
	width: calc(66.66667% + 15px);
}
.category {
	width: 100%;
	height: 100%;
	padding: 0 50px;
	-webkit-transition: all .6s ease;
	transition: all .6s ease;
	color:#fff;
}
.category__bg {
	position: absolute;
	width: 100%;
	height: 100%;
	left: 0;
	top: 0;
	-webkit-transition: all .9s ease;
	transition: all .9s ease;
}
.category__close {
	width: 50px;
	height:50px;
	position: absolute;
	cursor: pointer;
	right: 40px;
	top: 40px;
	z-index: 5
}
.category__close:before,
	.category__close:after {
	content:'';
	width: 100%;
	height: 3px;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom:0;
	margin: auto;
	background: rgba(255, 255, 255, 1);
	-webkit-transition: width 0.1s ease-in-out;
	transition: width 0.1s ease-in-out;

}
.category__close:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.category__close:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.category__close:hover:before,
	.category__close:hover:after {
	width: 80%;

}
.category__otherCategories {
	z-index: 4;
	position: relative;
}
.category__otherCategories-indicator {
	height: 9px;
	width: 60px;
	background: #fff;
}
.category__otherCategories-items {
	margin: 40px 0
}
.category__otherCategories-items li {
	-webkit-transition: fill .14s ease,-webkit-transform .3s ease;
	transition: fill .14s ease,-webkit-transform .3s ease;
	transition: transform .3s ease,fill .14s ease;
	transition: transform .3s ease,fill .14s ease,-webkit-transform .3s ease;
	-webkit-transform: scale(.9);
	        transform: scale(.9);
	cursor: pointer;
	margin-right: 15px;

}
.category__otherCategories-items li svg {
	fill:#fff;

}
.category__otherCategories-items li.active:nth-child(1) svg {
	fill: #005c9d;

}
.category__otherCategories-items li.active:nth-child(2) svg {
	fill: #f05805;

}
.category__otherCategories-items li.active:nth-child(3) svg {
	fill: #438862;

}
.category__otherCategories-items li.active:nth-child(4) svg {
	fill: #760c88;

}
.category__otherCategories-items li:hover,
	.category__otherCategories-items li.active {
	-webkit-transform: scale(1);
	        transform: scale(1);

}
.category__head {
	margin: 60px 0 40px;
	opacity: 0;
	-webkit-transform: translateX(-20px);
	        transform: translateX(-20px);
	-webkit-transition: all .3s ease;
	transition: all .3s ease;
}
.category__head--animate {
	opacity: 1;
	-webkit-transform: translateX(0);
	        transform: translateX(0);
}
.category__text {
	line-height: 1.4em;
	opacity: 0;
	-webkit-transform: translateY(20px);
	        transform: translateY(20px);
	-webkit-transition: all .3s ease .2s;
	transition: all .3s ease .2s
}
.category__text a {
	text-decoration: underline;

}
.category__text--animate {
	opacity: 1;
	-webkit-transform: translateY(0);
	        transform: translateY(0);
}
.category__bg::before,
	.category__bg::after {
	position: absolute;
	top: 0;
	left: 0;

}
.category--business {
	background: linear-gradient(45deg,#0498d5,#00b4ff);
}
.category--tech {
	background: linear-gradient(45deg,#fd9d14,#ffb142);
}
.category--student {
	background: linear-gradient(45deg,#3bcf56,#59e472);
}
.category--gos {
	background: linear-gradient(45deg,#d654fc,#df72ff);
}
.category__otherCategories-items {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}
.category__titleCards {
	position: absolute;
	z-index: 5;
	width: 100%;
	height: 100%;
	top:0;
	left:0;
}
.category__card {
	float: left;
	width:50%;
	height: 260px;
	padding: 30px 40px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	color:#fff;
	cursor: pointer
}
.category__card:hover svg {
	fill:#fff;
	-webkit-transform: scale(.9);
	        transform: scale(.9);

}
.category__card svg {
	-webkit-transform: scale(.8);
	        transform: scale(.8);
	-webkit-transition: fill .14s ease,-webkit-transform .3s ease;
	transition: fill .14s ease,-webkit-transform .3s ease;
	transition: transform .3s ease,fill .14s ease;
	transition: transform .3s ease,fill .14s ease,-webkit-transform .3s ease;

}
.category__card.category--business {
	fill: #005c9d;
}
.category__card.category--gos {
	fill: #760c88;
}
.category__card.category--tech {
	fill: #f05805;
}
.category__card.category--student {
	fill: #438862;
}
@media (max-width: 991px) {
	.mobile .category {
		padding-left: 20px;
		padding-right: 20px;

	}
	.mobile .categories__image {
		display: none;

	}
	.mobile .categories__cardsContainer {
		width: 100%;

	}
	.mobile .category__card-head {
		font-weight: 600;

	}
	.mobile .category__head {
		margin-top: 0;

	}
	.mobile .category__close {
		top: 10px;
		right: 10px;

	}
	.mobile .categories {
		margin-top: 60px;
		margin-bottom: 60px;
		padding-left: 30px;
		padding-right: 30px;
		overflow: hidden;

	}
	.mobile .category {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;

	}
	.mobile .category__card {
		padding-left: 20px;
		padding-right: 20px;

	}
	.mobile .category__card .blockName {
		font-size: 20px;

	}
	.mobile .category__otherCategories {
		height: 125px;

	}
	.mobile .category__dinamic {
		height: 372px;
		margin: 0 -20px;
		padding-top: 10px;

	}
	.mobile .category__dinamic > div {
		padding: 5px 20px 20px;
		overflow-y: auto;

	}
	.mobile .category__otherCategories-items {
		padding-right: 30px;
		margin-top: 10px;
		margin-bottom: 10px;

	}
	.mobile .category__otherCategories-items li svg {
		max-width: 100%;

	}

}
@media (max-width: 660px) {
	.mobile .category__card {
		float: none;
		width: 100%;
		height: 130px;
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;
		text-align: left;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;
		padding: 20px 10px;

	}
	.mobile .category__card svg {
		-webkit-box-flex: 0;
		    -ms-flex: none;
		        flex: none;
		height: 70px;
		width: 70px;
		margin-right: 5px;

	}
	.mobile .category__card-head {
		font-size: 16px;

	}
	.mobile .category__close {
		width: 40px;
		height: 40px;

	}
	.mobile .category__head {
		margin: 0;
		margin-bottom: 10px;

	}

}
@media (max-width: 478px) {
	.mobile .categories {
		margin-top: 40px;
		margin-bottom: 40px;
		padding-left: 15px;
		padding-right: 15px;

	}
	.mobile .category__head {
		font-size: 20px;

	}
	.mobile .category__card .blockName {
		font-size: 14px;
		margin: 0;

	}
	.mobile .category__otherCategories-indicator {
		display: none;

	}
	.mobile .category__otherCategories-items {
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;
		max-width: 250px;

	}
	.mobile .category__otherCategories-items li {
		width: 50%;
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;
		margin-right: 0;

	}
	.mobile .category__otherCategories-items li svg {
		height: 60px;
		width: 60px;

	}

}
.news {
	margin-top: 100px;
	margin-bottom: 100px;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .news {
		margin-top: 70px;
		margin-bottom: 70px;
		padding-left: 15px;
		padding-right: 15px;

	}
}
@media (max-width: 478px) {
	.mobile .news {
		margin-top: 40px;
		margin-bottom: 40px;
		padding-left: 0;
		padding-right: 0;

	}
}
.events {
	margin-top: 60px;
	margin-bottom: 60px
}
.events .container {}
.events .sectionName {
	margin-bottom: 25px;
	color: #009cff;
	font-size: 36px;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.events {
		margin-top: 30px;
		margin-bottom: 30px;
		padding-left: 15px;
		padding-right: 15px;
	}
}
@media (max-width: 478px) {
	.events {
		margin-top: 20px;
		margin-bottom: 20px;
		padding-left: 0;
		padding-right: 0;
	}
}
/* @supports (display:flex) {
	.events {
		border: 1px solid red;
	}
} */
.mobile .siteTitle--mobile {
	background-color: rgb(41, 155, 253);
	background-image: url(../images/title.png);
	background-position: left top;
	background-size: auto;
	background-repeat: repeat;

	/* background:rgb(41, 155, 253)  50% 50%/cover; */

}
.mobile .siteTitle--mobile .mainPage__headerMobile .headerMobile {

	/* background: transparent !important; */
	background-size: auto;
	background-position: left top;
	background-repeat: repeat;

}
.mobile .siteTitle--mobile .headerMobile {
	height: auto;
	padding: 0;

	/* box-shadow: none; */

}
.mobile .siteTitle--mobile .mainPage__headerMobile .siteHeader__ifFixedHeader {
	height: 100px;

}


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    _classCallCheck(this, _default);
  }

  _createClass(_default, [{
    key: "fadeIn",
    value: function fadeIn(el) {
      var _this = this;

      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (!el) return;
      var stop = false;
      dispatchEvent(new CustomEvent('fadeIn', {
        detail: el
      }));
      var _options$duration = options.duration,
          duration = _options$duration === void 0 ? 400 : _options$duration,
          _options$delay = options.delay,
          delay = _options$delay === void 0 ? 0 : _options$delay,
          callback = options.callback;
      if (el.classList.contains('fadeIn')) return;
      el.classList.add('fadeIn');
      el.style.display = 'flex';
      el.style.opacity = 0;
      el.style.transform = ' translateY(-10%)';
      return new Promise(function (resolve, reject) {
        var start = Date.now() + delay;

        var animation = function animation() {
          if (Date.now() < start) {
            requestAnimationFrame(animation);
            return;
          }

          if (stop) return;

          var progress = _this.__progress(start, duration);

          el.style.opacity = 1 * progress;
          el.style.transform = "translateY(".concat(-10 * (1 - progress), "%)");

          if (progress === 1) {
            // callback();
            return;
          }

          requestAnimationFrame(animation);
        };

        requestAnimationFrame(animation);
      });
    }
  }, {
    key: "fadeOut",
    value: function fadeOut(el) {
      var _this2 = this;

      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (!el) return;
      var stop = false;
      dispatchEvent(new CustomEvent('fadeOut', {
        detail: el
      }));
      var _options$duration2 = options.duration,
          duration = _options$duration2 === void 0 ? 400 : _options$duration2,
          _options$delay2 = options.delay,
          delay = _options$delay2 === void 0 ? 0 : _options$delay2,
          callback = options.callback;
      var initalOpacity = el.style.opacity || 1;
      return new Promise(function (resolve, reject) {
        var start = Date.now() + delay;

        var animation = function animation() {
          if (Date.now() < start) {
            requestAnimationFrame(animation);
            return;
          }

          if (stop) return;

          var progress = _this2.__progress(start, duration);

          el.style.opacity = initalOpacity - 1 * progress;
          el.style.transform = "translateY(".concat(-10 * progress, "%)");

          if (progress === 1) {
            // callback();
            el.classList.remove('fadeIn');
            el.style.display = '';
            el.style.opacity = '';
            el.style.transform = '';
            resolve();
            return;
          }

          requestAnimationFrame(animation);
        };

        requestAnimationFrame(animation);
      });
    }
  }, {
    key: "__progress",
    value: function __progress(start, duration) {
      var progress = (Date.now() - start) / duration;
      if (progress > 1) progress = 1;
      return this.__timing(progress);
    }
  }, {
    key: "__timing",
    value: function __timing(progress) {
      return Math.sin(Math.acos(Math.pow(progress, 1.4) - 1));
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _transitionEnd = _interopRequireDefault(__webpack_require__(/*! ./transitionEnd */ "./src/layout/js/transitionEnd.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  // передается элемент который показывается/скрывается и элементы, которые надо закрыть параметром "высота"
  function _default(bgElement, parents, parameter, transitionendCallback) {
    _classCallCheck(this, _default);

    this.el = bgElement;
    this.parents = parents || this.el;
    this.parameter = parameter;
    this[this.parameter] = {
      init: parseInt(getComputedStyle(this.el)[this.parameter])
    };
    if (transitionendCallback) this.transitionEnd = new _transitionEnd.default({
      element: this.el,
      callback: transitionendCallback
    });
    this.__animationCount = 0;
  }

  _createClass(_default, [{
    key: "show",
    value: function show() {
      var _this = this;

      this.__showing = true;
      this[this.parameter].start = parseInt(getComputedStyle(this.el)[this.parameter]) || 0;
      this.el.style[this.parameter] = this[this.parameter].start + 'px';
      var animationNumber = this.__animationCount++;
      this.el.style['transition'] = 'height .3s ease';
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          var menuHeight = 0;
          if (_this.parents instanceof Array) {
            if (_this.parents.length == 1) {
              menuHeight = parseInt(getComputedStyle(_this.parents[0])[_this.parameter]);
            } else {
              _this.parents.forEach(function (item) {
                var value = parseInt(getComputedStyle(item)[_this.parameter]);
                if (value !== value) return;
                menuHeight += value;
              });
            }
          } else {
            menuHeight = parseInt(getComputedStyle(_this.parents)[_this.parameter]);
          }
          _this.el.style[_this.parameter] = menuHeight + 'px';
        });
      });
    }
  }, {
    key: "hide",
    value: function hide() {
      var _this2 = this;

      this.__hiding = true;
      this.el.style['transition'] = 'height .3s ease .2s';
      if (!this.__showing && !this.__showed) return;
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          _this2.el.style[_this2.parameter] = '0px';
        });
      });
    }
  }, {
    key: "removeCallback",
    value: function removeCallback() {
      this.transitionEnd && this.transitionEnd.end();
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var TransitionEnd =
/*#__PURE__*/
function () {
  function TransitionEnd(options) {
    _classCallCheck(this, TransitionEnd);

    this.element = options.element || window;
    this.callback = options.callback.bind(this);
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(TransitionEnd, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener('transitionend', this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener('transitionend', this.callback);
    }
  }]);

  return TransitionEnd;
}();

exports.default = TransitionEnd;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/animation */ "./src/layout/js/animation.js"));

var _background = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/background */ "./src/layout/js/background.js"));

var _transitionEnd = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/transitionEnd */ "./src/layout/js/transitionEnd.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var PageNavMenu =
/*#__PURE__*/
function (_Animation) {
  _inherits(PageNavMenu, _Animation);

  function PageNavMenu() {
    var _this;

    _classCallCheck(this, PageNavMenu);

    _this = _possibleConstructorReturn(this, (PageNavMenu.__proto__ || Object.getPrototypeOf(PageNavMenu)).call(this));
    _this.container = document.getElementsByClassName('container__pageNav')[0];
    _this.el = document.getElementsByClassName('pageNav')[0];
    _this.links = _this.el.querySelectorAll('.pageNav__li a');
    _this.menu = document.getElementsByClassName('pageNav__menu')[0];

    var menuItems = _this.menu.querySelectorAll('[data-menu-block-name]');

    _this.bg = new _background.default(document.getElementsByClassName('pageNav__bg')[0], [document.querySelector('.container__pageNav .container')].concat(_toConsumableArray(menuItems)), 'height');
    [].forEach.call(_this.links, function (item) {
      _this.logicFromItem(item);
    });

    _this.logicNavPanel();

    return _this;
  }

  _createClass(PageNavMenu, [{
    key: "logicFromItem",
    value: function logicFromItem(item) {
      var _this2 = this;

      var menuBlockName = item.dataset.menuBlockName;
      var el = this.menu.querySelector("[data-menu-block-name=\"".concat(menuBlockName, "\"]"));
      item.addEventListener('mouseenter', function (event) {
        _this2.hideBlocks(el);

        [].forEach.call(_this2.links, function (link) {
          link.classList.remove('--active');
        });

        _this2.container.classList.add('pageNav__opened');

        item.classList.add('--active');
        if (!el.classList.contains('fadeIn')) el.classList.remove('--active');
        requestAnimationFrame(function () {
          requestAnimationFrame(function () {
            el.classList.add('--active');
          });
        });

        _this2.bg.show();

        _this2.sliderLogic(item);

        el.classList.add('fadeIn');
        el.style.display = 'block';
      });
    }
  }, {
    key: "hideBlocks",
    value: function hideBlocks(el) {
      var els = this.menu.querySelectorAll(".fadeIn[data-menu-block-name]");
      [].forEach.call(els, function (item) {
        if (el && item == el) return;
        item.classList.remove('fadeIn');
        item.style.display = 'none';
      });
    }
  }, {
    key: "logicNavPanel",
    value: function logicNavPanel() {
      var _this3 = this;

      this.container.addEventListener('mouseleave', function (event) {
        var els = _this3.menu.querySelectorAll(".fadeIn[data-menu-block-name]");

        [].forEach.call(els, function (item) {
          item.classList.remove('fadeIn');
          item.classList.remove('--active');
          var tr = new _transitionEnd.default({
            element: item,
            callback: function callback() {
              item.style.display = 'none';
            }
          });
          setTimeout(function () {
            item.style.display = 'none';
            tr.end();
          }, 300);
        });

        _this3.bg.hide();

        _this3.container.classList.remove('pageNav__opened');
      });
    }
  }, {
    key: "sliderLogic",
    value: function sliderLogic(item) {
      var slider = this.container.getElementsByClassName('pageNav__indicator-slider')[0];
      var menuCoords = this.menu.getBoundingClientRect();
      var liCoords = item.getBoundingClientRect();
      var width = liCoords.right - liCoords.left;
      slider.style.left = liCoords.left - menuCoords.left + 'px';
      slider.style.width = width + 'px';
    }
  }]);

  return PageNavMenu;
}(_animation.default);

exports.default = PageNavMenu;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/animation.js */ "./src/layout/js/animation.js"));

var _click = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/click.js */ "./src/layout/js/click.js"));

var _customListener = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/customListener.js */ "./src/layout/js/customListener.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Ball =
/*#__PURE__*/
function (_Animation) {
  _inherits(Ball, _Animation);

  function Ball() {
    var _this;

    _classCallCheck(this, Ball);

    _this = _possibleConstructorReturn(this, (Ball.__proto__ || Object.getPrototypeOf(Ball)).call(this));
    _this.__balls = {};

    var a = _toConsumableArray(document.querySelectorAll('[data-click-ball]'));

    a.forEach(function (item) {
      return _this.initBall(item);
    });
    return _this;
  }

  _createClass(Ball, [{
    key: "initBall",
    value: function initBall(item) {
      var _this2 = this;

      var scrollToTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var Name = item.dataset.clickBall;
      var container = document.querySelector("[data-ball-click=\"".concat(Name, "\"]"));
      var bg = container.querySelector('div');

      var fn = function fn(event) {
        if (event.target.closest('.newsCard__tag')) {
          return;
        }

        var windowWidth = document.documentElement.clientWidth;
        document.body.style.width = document.documentElement.clientWidth + 'px';
        document.body.style.overflow = 'hidden';
        var scrollBar = document.documentElement.clientWidth - windowWidth;
        _this2.resizeListener = new _customListener.default({
          listener: 'resize',
          callback: function callback() {
            document.body.style.width = document.documentElement.offsetWidth - scrollBar + 'px';
          }
        });
        var x = event.x,
            y = event.y;
        var scroll = window.pageYOffset;
        _this2.__balls[Name] = {
          container: container,
          bg: bg,
          close: container.querySelector('[data-ball-close]'),
          scroll: scroll,
          x: x,
          y: y
        };
        requestAnimationFrame(function () {
          container.style.display = 'block';
          container.style.top = y + 'px';
          container.style.left = x + 'px';
          bg.style.left = -x + 'px';
          bg.style.top = -y + 'px';

          if (scrollToTop) {
            window.dispatchEvent(new CustomEvent('scrollToTop'));
          }

          _this2.openContainer(Name);
        });

        _this2.videoSettings(Name);
      };

      item.addEventListener('click', fn);
      return fn;
    }
  }, {
    key: "openContainer",
    value: function openContainer(Name) {
      var _this3 = this;

      var _balls$Name = this.__balls[Name],
          container = _balls$Name.container,
          x = _balls$Name.x,
          y = _balls$Name.y,
          bg = _balls$Name.bg,
          scroll = _balls$Name.scroll,
          close = _balls$Name.close;
      var start = Date.now();
      var _document$documentEle = document.documentElement,
          clientWidth = _document$documentEle.clientWidth,
          clientHeight = _document$documentEle.clientHeight;
      var Size = Math.sqrt(Math.pow(clientWidth, 2) + Math.pow(clientHeight, 2)) * 2;

      var animate = function animate() {
        var progress = _this3.__progress(start, 1000);

        var progressSize = Size * progress;
        container.style.width = progressSize + 'px';
        container.style.height = progressSize + 'px';
        var top = y + (clientHeight / 2 - y - Size / 2) * progress;
        var left = x + (clientWidth / 2 - x - Size / 2) * progress;
        container.style.top = top + 'px';
        container.style.left = left + 'px';
        bg.style.top = -top + 'px';
        bg.style.left = -left + 'px';

        if (progress === 1) {
          var closeClickListener = new _click.default({
            element: close,
            callback: function callback() {
              _this3.closeContainer(Name);

              closeClickListener.end();
            }
          });
          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }, {
    key: "closeContainer",
    value: function closeContainer(Name) {
      var _this4 = this;

      var newScroll = window.pageYOffset;
      var _balls$Name2 = this.__balls[Name],
          container = _balls$Name2.container,
          scroll = _balls$Name2.scroll,
          close = _balls$Name2.close,
          bg = _balls$Name2.bg,
          video = _balls$Name2.video;

      if (video) {
        video.pause();
        this.videoListeners.forEach(function (item) {
          item.end();
        });
      }

      var _balls$Name3 = this.__balls[Name],
          x = _balls$Name3.x,
          y = _balls$Name3.y;
      y = scroll + y - newScroll;
      var start = Date.now();
      var _document$documentEle2 = document.documentElement,
          clientWidth = _document$documentEle2.clientWidth,
          clientHeight = _document$documentEle2.clientHeight;
      var Size = parseInt(getComputedStyle(container).width);

      var animate = function animate() {
        var progress = 1 - _this4.__progress(start, 500);

        var progressSize = Size * progress;
        container.style.width = progressSize + 'px';
        container.style.height = progressSize + 'px';
        var top = y + (clientHeight / 2 - y - Size / 2) * progress;
        var left = x + (clientWidth / 2 - x - Size / 2) * progress;
        container.style.top = top + 'px';
        container.style.left = left + 'px';
        bg.style.top = -top + 'px';
        bg.style.left = -left + 'px';

        if (progress === 0) {
          document.body.style.overflow = '';
          document.body.style.width = '';

          _this4.resizeListener.end();

          container.style.display = 'none';

          if (container.querySelector('iframe')) {
            var iframe = container.querySelector('iframe');
            var nextEl = iframe.nextElementSibling;
            iframe.parentNode.insertBefore(!iframe.remove() && iframe, nextEl);
          }

          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }, {
    key: "videoSettings",
    value: function videoSettings(Name) {
      var _this5 = this;

      this.videoListeners = [];
      var content = this.__balls[Name].bg;
      var video = content.querySelector('.video');
      if (!video) return;
      this.__balls[Name].video = video;
      var progress = content.querySelector('.video__progress-actual');
      var stopButton = content.querySelector('.video__stop');
      video.play().then(function () {
        function togglePlay() {
          if (status == 'played') {
            video.pause();
            status = 'stopped';
          } else if (status == 'stopped') {
            video.play();
            status = 'played';
          }
        }

        _this5.videoListeners.push(new _click.default({
          element: stopButton,
          callback: function callback() {
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _click.default({
          element: video,
          callback: function callback() {
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'timeupdate',
          callback: _this5.videoSetProgress(video)
        }));

        var status = 'played';

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'play',
          callback: function callback() {
            status = 'played';
            stopButton.classList.remove('video__stop--stopped');
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'pause',
          callback: function callback() {
            status = 'stopped';
            stopButton.classList.add('video__stop--stopped');
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          listener: 'keyup',
          callback: function callback(e) {
            if (e.which !== 32) return;
            stopButton.classList.add('video__stop--stopped');
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _click.default({
          element: content.getElementsByClassName('video__progress')[0],
          callback: function callback(e) {
            var x = e.x;
            var clickProgress = x / this.offsetWidth;
            video.currentTime = video.duration * clickProgress;
          }
        }));

        var mute = new _click.default({
          element: content.getElementsByClassName('video__mute')[0],
          callback: function callback() {
            if (!video.muted) {
              video.muted = true;
              mute.element.classList.add('video__mute--muted');
            } else {
              video.muted = false;
              mute.element.classList.remove('video__mute--muted');
            }
          }
        });

        _this5.videoListeners.push(mute);
      }).catch(function () {
        console.log('Не запустилось');
      });
    }
  }, {
    key: "videoSetProgress",
    value: function videoSetProgress(video) {
      var container = video.parentElement;
      var actualProgress = container.querySelector('.video__progress-actual');
      var actualTime = container.getElementsByClassName('video__actualTime')[0];
      var actualTime_minutes = actualTime.querySelector('.video__actualTime-minutes');
      var actualTime_seconds = actualTime.querySelector('.video__actualTime-seconds');
      var fullTime = container.getElementsByClassName('video__fullTime')[0];
      var fullTime_minutes = fullTime.querySelector('.video__fullTime-minutes');
      var fullTime_seconds = fullTime.querySelector('.video__fullTime-seconds');
      var fullMin = ~~(video.duration / 60);
      var fullSec = ~~(video.duration % 60);
      if (fullMin < 10) fullMin = '0' + fullMin;
      if (fullSec < 10) fullSec = '0' + fullSec;
      fullTime_minutes.textContent = fullMin;
      fullTime_seconds.textContent = fullSec;
      return function () {
        var progress = video.currentTime / video.duration;
        var actualMin = ~~(video.currentTime / 60);
        var actualSec = ~~(video.currentTime % 60);
        if (actualMin < 10) actualMin = '0' + actualMin;
        if (actualSec < 10) actualSec = '0' + actualSec;
        actualTime_minutes.textContent = actualMin;
        actualTime_seconds.textContent = actualSec;
        actualProgress.style.transition = 'width .2s linear';
        actualProgress.style.width = progress * 100 + '%';
      };
    }
  }]);

  return Ball;
}(_animation.default);

exports.default = Ball;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

// version 0.0.0
var Click =
/*#__PURE__*/
function () {
  function Click(options) {
    _classCallCheck(this, Click);

    this.element = options.element || window;
    this.callback = options.callback;
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(Click, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener('click', this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener('click', this.callback);
    }
  }]);

  return Click;
}();

exports.default = Click;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

// version 0.0.0
var _default =
/*#__PURE__*/
function () {
  function _default(options) {
    _classCallCheck(this, _default);

    this.element = options.element || window;
    this.callback = options.callback;
    this.listener = options.listener;
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(_default, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener(this.listener, this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener(this.listener, this.callback);
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Router = exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PageDraw =
/*#__PURE__*/
function () {
  function PageDraw() {
    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

    _classCallCheck(this, PageDraw);

    this.id = Date.now() * Math.random();
    this.__data = {};

    if (options.data) {
      this.data = options.data; // использовать ли кэш в js

      this.cache = options.cache || 1;
    }

    if (options.localData) {
      this.localData = options.localData;
    } // позиция, куда все это вставляется


    this.position = options.position || null; // Конфигурация родительского элемента, в котором будет контент

    this.__element = options.element || 'div';
    this.__className = options.class; // логирование действий скрипта

    this.__indication = options.indication || null; // контент, который можно указать при инициализации.

    this.__cont = options.content || null; // функция запускается после отрисовки и в ней должен быть код, как показать контент.
    // анимация появления

    this.show = options.show || null;
    this.hide = options.hide || null; // функция после анимации появления

    this.__callback = options.callback || null;

    if (options.container) {
      this.__prerender = true;
      this.__drawed = true;
    } // элемент, в который загрузится контент.


    this.block = options.container || document.createElement(this.__element);

    if (this.__className) {
      this.block.className = this.__className;
    }

    if (options.id) {
      this.block.id = options.id;
    } // массив детей, для установки зависимостей


    this.childrenArray = [];
    this.__changedCache = false;
    this.childrenHideModules = [];
  }

  _createClass(PageDraw, [{
    key: "isChildren",
    value: function isChildren(object) {
      for (var i = 0; i < this.childrenArray.length; i++) {
        var child = this.childrenArray[i];
        if (child == object) return true;
      }

      return false;
    }
  }, {
    key: "__drawLogic",
    value: function __drawLogic() {
      if (window.development || this.__indication) {
        if (!this.__cont) {
          this.__drawStart = false;
          throw new Error('Нету контента для отрисовки.');
        }
      }

      if (this.__cont instanceof Function) {
        return this.__drawForFunction();
      } else if (typeof this.__cont == 'string') {
        return this.__drawForString();
      } else {
        this.__drawStart = false;
        var error = new Error('Конетент не функция и не строка, а массив и объект не допустимы.');
        console.error(this.id, error);
        throw error;
      }
    }
  }, {
    key: "__drawForFunction",
    value: function __drawForFunction() {
      var _this = this;

      if (window.development || this.__indication) {
        console.log(this.id, 'Зашло в отрисовку функции');
      }

      var data;

      if (this.url) {
        data = this.cacheControl(this.url);
      } else if (this.localData) {
        data = Promise.resolve(this.localData);

        if (window.development || this.__indication) {
          console.log(this.id, 'Взяло локальные данные');
        }
      }

      return data.then(function (result) {
        if (window.development || _this.__indication) {
          console.log(_this.id, 'Отрисовка из данных');
        }

        if (window.development || _this.__indication) {
          if (!result) {
            console.warn(_this.id, 'Промис не отдал результат или ответ сервера пустой.');
            result = '';
          }
        }

        if (window.development || _this.__indication) {
          if (!_this.__cont(result)) {
            console.warn(_this.id, 'Функция контента ничего не возвращает');
          }
        }

        if (_this.hide && _this.__drawed) {
          return _this.hide().then(function () {
            _this.block.innerHTML = _this.__cont(result);
            _this.__changedCache = false;

            _this.insertCont();
          });
        } else {
          _this.block.innerHTML = _this.__cont(result);
          _this.__changedCache = false;

          if (!_this.block.offsetWidth) {
            _this.insertCont();
          } else {
            if (_this.show) {
              setTimeout(function () {
                _this.show();
              });

              if (window.development || _this.__indication) {
                console.log(_this.id, 'Анимировано', _this.block);
              }
            }

            _this.__drawed = true;
            _this.__drawStart = false;
          }
        }
      }).catch(function (err) {
        if (window.development || _this.__indication) {
          console.warn(_this.id, 'Ошибка в промисе получения данных, возможно 404');
        }

        _this.__drawStart = false;
        throw err;
      });
    }
  }, {
    key: "__drawForString",
    value: function __drawForString() {
      var _this2 = this;

      if (window.development || this.__indication) {
        console.log(this.id, 'Зашло в отрисовку строки');
      }

      if (this.__changedCache && this.__drawed) {
        if (window.development || this.__indication) {
          console.log(this.id, "Остановлено, смена кэша не изменит строку.");
        }

        this.__drawStart = false;
        this.__drawed = true;
        return Promise.reject();
      }

      if (window.development || this.__indication) {
        if (!this.__cont) {
          console.warn(this.id, 'Строка контента пуста');
        }
      }

      if (this.hide && this.__drawed) {
        return this.hide().then(function () {
          _this2.block.innerHTML = _this2.__cont;

          _this2.insertCont();
        });
      } else {
        this.block.innerHTML = this.__cont;

        if (!this.block.offsetWidth) {
          this.insertCont();
        } else {
          if (this.show) {
            setTimeout(function () {
              _this2.show();
            });

            if (window.development || this.__indication) {
              console.log(this.id, 'Анимировано', this.block);
            }
          }

          this.__drawed = true;
          this.__drawStart = false;
        }

        return Promise.resolve();
      }
    }
  }, {
    key: "insertCont",
    value: function insertCont() {
      var _this3 = this;

      var array = this.position;

      if (this.development || this.__indication) {
        if (!array) console.log('Нет позиции');
      }

      for (var index = 0; index < array.length; index++) {
        var _array$index = array[index],
            place = _array$index.place,
            element = _array$index.element,
            father = _array$index.father;
        if (father && father != this.father.__className) continue;
        var searchElement = document.querySelector(element);

        if (searchElement) {
          searchElement.insertAdjacentElement(place, this.block);
          this.__drawed = true;
          break;
        }
      }

      if (!this.__drawed && !searchElement && (this.__indication || window.development)) {
        console.log('%c Не отрисовано, не найден элемент', 'background: #ff0037; color: #fff');
      }

      if (this.childrenArray.length) {
        for (var i = 0; i < this.childrenArray.length; i++) {
          var child = this.childrenArray[i];
          child.drawed = false;
        }
      }

      if (!this.__drawed && searchElement && (window.development || this.__indication)) {
        console.log(this.id, 'Отрисовано', this.block);
      }

      if (this.show) {
        setTimeout(function () {
          _this3.show();
        });

        if (window.development || this.__indication) {
          console.log(this.id, 'Анимировано', this.block);
        }
      } //drawStart -> конец отрисовки


      this.__drawStart = false;
    }
  }, {
    key: "cacheControl",
    value: function cacheControl(url, options, preload) {
      //защита от двойного клика
      // preload == true дает подгрузить данные независимо от загрузки основных данных.
      if (this.loading && !preload) return this[url]; //

      if (!this.cache) {
        this.loadData(url, options);
        return this[url];
      }

      if (!this[url] || !this.__data[url]) {
        this.loadData(url, options);
      } else {
        if (window.development || this.__indication) {
          console.log(this.id, 'Взято из кэша', url);
        }
      }

      return this.__data[url] && Promise.resolve(this.__data[url]) || this[url];
    }
  }, {
    key: "loadData",
    value: function loadData(url) {
      var _this5 = this;

      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      if (window.development || this.__indication) {
        if (!url) {
          console.error('Нету ссылки на данные');
          return;
        }
      }

      function request() {
        var _this4 = this;

        this.loading = true;
        var xhr = new XMLHttpRequest();
        var method = options.method || 'GET';
        xhr.open(method, url, true);
        var promise = new Promise(function (resolve, reject) {
          xhr.onload = function () {
            if (xhr.status !== 200) {
              reject();
            } else {
              if (window.development || _this4.__indication) {
                console.log(_this4.id, _this4[url], url, 'скачано');
              }

              var data;

              try {
                data = JSON.parse(xhr.responseText);
              } catch (e) {
                data = xhr.responseText;
              }

              resolve(data);
              _this4.__data[url] = data;
            }

            _this4.loading = false;
          };

          xhr.onerror = function (e) {
            _this4.loading = false;
            var error = new Error(xhr.status + ': ' + xhr.statusText);
            console.error(_this4.id, 'Ajax error', error, url);
            delete _this4[url];
            reject(error);
          }; //всегда без кэша, его делает приложение


          xhr.setRequestHeader('Cache-Control', 'no-cache');
          method == 'POST' ? xhr.send(options.body) : xhr.send();
        });
        this[url] = promise;
        return promise;
      }

      var promise = request.call(this);
      return promise.catch(function () {
        return request.call(_this5);
      });
    }
  }, {
    key: "content",
    set: function set(code) {
      if (window.development || this.__indication) {
        console.log(this.id, 'Изменен контент, можно перерисовать.');

        if (code instanceof Function) {
          console.log(this.id, 'Контент - функция');
        } else {
          console.log(this.id, 'Контент - строка');
        }
      }

      this.__cont = code;
      this.__drawed = false;
    },
    get: function get() {
      return this.__cont;
    }
  }, {
    key: "child",
    set: function set(object) {
      if (this.isChildren(object)) return null;
      this.childrenArray.push(object);
      object.father = this;
    }
  }, {
    key: "children",
    get: function get() {
      return this.childrenArray;
    }
  }, {
    key: "removeChild",
    set: function set(object) {
      for (var i = 0; i < this.childrenArray.length; i++) {
        var child = this.childrenArray[i];

        if (child === object) {
          child = null;
          return true;
        }
      }

      return null;
    }
  }, {
    key: "removeChildren",
    get: function get() {
      this.childrenArray = [];

      if (window.development || this.__indication) {
        console.log(this.id, 'Дети(зависимости) удалены');
      }

      return this.childrenArray;
    }
  }, {
    key: "position",
    set: function set(code) {
      if (!code) return;

      if (window.development || this.__indication) {
        console.log(this.id, 'Изменена/добавлена позиция, нужно отрисовать');
      }

      this.__drawed = false; // this.changePosition = true; ** 1

      if (code instanceof Array) {
        this.__pos = code;
        return;
      } else if (code instanceof Object) {
        this.__pos = [code];
        return;
      } // 'afterend .header' || ['afterend',document.querySelector('.header')]
      else if (typeof code == 'string') {
          var arr = code.split(' ');
          this.__pos = [{
            place: arr[0],
            element: arr[1],
            father: arr[2]
          }];
          return;
        }

      if (window.development || this.__indication) {
        if (!(code instanceof Object)) console.error(this.id, "\u041F\u043E\u0437\u0438\u0446\u0438\u044F - \u044D\u0442\u043E \u0441\u0442\u0440\u043E\u043A\u0430, \u043E\u0431\u044A\u0435\u043A\u0442({place:'beforeend',element:'.app'[,father: (this.father.class)]}) \u0438\u043B\u0438 \u043C\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432");
      }
    },
    get: function get() {
      return this.__pos;
    }
  }, {
    key: "draw",
    get: function get() {
      var _this6 = this;

      if (this.__drawStart) {
        if (window.development || this.__indication) {
          console.log(this.id, 'Уже идет отрисовка, вторая параллельно отклонена.');
        }

        return null;
      }

      if (this.__drawed && this.changedChildrens) {
        if (this.childrenArray.length) {
          for (var i = 0; i < this.childrenArray.length; i++) {
            var child = this.childrenArray[i];
            child.drawed = false;
            child.draw;
          }
        }
      }

      if (this.__drawed && !this.__changedCache) {
        if (window.development || this.__indication) {
          console.log(this.id, 'Не отрисовано, изменений не замечено.');
        }

        return null;
      } // drawStart -> Пошла отрисовка


      this.__drawStart = true;
      return this.__drawLogic().then(function () {
        if (_this6.childrenArray.length) {
          for (var i = 0; i < _this6.childrenArray.length; i++) {
            var _child = _this6.childrenArray[i];
            _child.draw;
          }
        }

        if (_this6.__callback) _this6.__callback();
      }).catch(function (e) {
        if (window.development || _this6.__indication) {
          console.log(_this6.id, 'По какой-то причине, отрисовка завершена.', e);
        }
      });
    }
  }, {
    key: "delete",
    get: function get() {
      var _this7 = this;

      if (this.childrenArray.length) {
        for (var i = this.childrenArray.length - 1; i >= 0; i--) {
          this.children[i].delete;
        }
      }

      if (this.hide) {
        var a = this.hide().then(function () {
          if (_this7.childrenHideModules && _this7.childrenHideModules.length) {
            Promise.all(_this7.childrenHideModules).then(function (value) {
              _this7.__drawed = false;

              _this7.block.remove();

              if (window.development || _this7.__indication) {
                console.log(_this7.id, 'Элемент удален');
              }
            }, function (reason) {
              console.warn('Проблемы выполнения просима анимации', _this7.id);
            });
          } else {
            _this7.__drawed = false;

            _this7.block.remove();

            if (window.development || _this7.__indication) {
              console.log(_this7.id, 'Элемент удален');
            }
          }

          _this7.childrenHideModules = []; // end then
        }); // посмотреть где используется и убрать есть не нужно
        // window.hideModules.push(a);

        if (this.father) {
          this.father.childrenHideModules.push(a);

          if (this.childrenHideModules && this.childrenHideModules.length) {
            this.father.childrenHideModules.push(Promise.all(this.childrenHideModules));
          }
        }
      } else {
        this.__drawed = false;
        this.block.remove();

        if (window.development || this.__indication) {
          console.log(this.id, 'Элемент удален');
        }
      }
    }
  }, {
    key: "data",
    set: function set(url) {
      if (this.url == url) {} else {
        this.__changedCache = true;
        this.url = url;
        this.cacheControl(this.url);
      }
    },
    get: function get() {
      if (this.url) {
        return this.cacheControl(this.url);
      } else {
        var error = new Error('Запрошены данные, которых нет.');
        console.error(this.id, 'В this.url нет данных о ссылке, по которой должны были загрузиться данные.', error.stack);
        throw error;
      }
    }
  }, {
    key: "localData",
    set: function set(data) {
      // debugger
      if (this.__localData !== data) {
        this.__localData = data;
        this.__changedCache = true;
      }
    },
    get: function get() {
      if (this.__localData) {
        return this.__localData;
      } else {
        var error = new Error('Запрошены данные, которых нет.');
        console.error(this.id, 'Нету локальных данных', error.stack);
        throw error;
      }
    }
  }]);

  return PageDraw;
}();

exports.default = PageDraw;

var Router =
/*#__PURE__*/
function () {
  function Router(structure) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Router);

    this.__indication = options.indication || null;

    if (structure) {
      this.route(structure);
    }
  }

  _createClass(Router, [{
    key: "structure",
    value: function structure(object) {
      function __parse(element, children) {
        element.removeChildren;
        element.changedChildrens = true;

        for (var i = 0; i < children.length; i++) {
          var child = children[i];

          if (child.element) {
            __parse(child.element, child.subjects);

            element.child = child.element;
            child.element.father = element;
          } else {
            element.child = child;
            child.father = element;
          }
        }
      }

      if (this.activeStructure) {
        // this.activeStructure.element.delete;
        if (this.activeStructure == object) return;
        var activeElements = [];
        var newElements = [];

        __parseForDelete(this.activeStructure, activeElements);

        __parseForDelete(object, newElements); // activeElements.forEach(function(activeItem){
        // 	newElements.forEach(function(newItem,newItemIndex){
        // 		if (activeItem != newItem && newItemIndex == newItemsCount) {
        // 			activeItem.delete;
        // 		}
        // 	});
        // });


        for (var i = activeElements.length - 1; i >= 0; i--) {
          activeElements[i].removeChildren;

          for (var q = newElements.length - 1; q >= 0; q--) {
            if (activeElements[i] == newElements[q]) break;

            if (q == 0) {
              activeElements[i].delete;
            }
          }
        }
      }

      this.activeStructure = object;

      __parse(object.element, object.subjects); // asdsd.structure({
      // 	element: nav,
      // 	children: [
      // 		page1,
      // 		{
      // 			element:page2,
      // 			children: [
      // 				navButton,
      // 				closeButton
      // 			]
      // 		}
      // 	]
      // });


      function __parseForDelete(object, array) {
        array.push(object.element);
        object.subjects.forEach(function (item, index) {
          if (item.subjects) {
            __parseForDelete(item, array);
          } else {
            array.push(item);
          }
        });
      }
    }
  }, {
    key: "route",
    value: function route(pages) {
      var _this8 = this;

      var href = location.pathname;

      for (var i = 0; i < pages.length; i++) {
        if (pages[i].link == href) {
          this.structure(pages[i].structure);
          pages[i].structure.element.draw;
          scrollTo(0, 0);
          break;
        } else if (i === pages.length - 1) {
          console.warn('Подходящая ссылка не найдена');
        }
      } // pages это массив из структур(объектов)


      addEventListener('click', function (event) {
        var el = event.target.tagName == 'A' && event.target || event.target.closest('a');

        if (el) {
          for (var i = 0; i < pages.length; i++) {
            var _href = el.getAttribute('href');

            if (pages[i].link == _href) {
              _this8.structure(pages[i].structure);

              pages[i].structure.element.draw;
              scrollTo(0, 0);
              event.preventDefault();
              history.pushState({
                href: _href
              }, '', _href);
              break;
            } else if (i === pages.length - 1) {
              console.warn('Подходящая ссылка не найдена');
            }
          }
        }
      });
      addEventListener('popstate', function (event) {
        var href = event.state && event.state.href || location.pathname;

        for (var i = 0; i < pages.length; i++) {
          if (pages[i].link == href) {
            _this8.structure(pages[i].structure);

            pages[i].structure.element.draw;
            scrollTo(0, 0);
            break;
          } else if (i === pages.length - 1) {
            console.warn('Подходящая ссылка не найдена');
          }
        }
      });
    }
  }, {
    key: "setPage",
    value: function setPage() {}
  }]);

  return Router;
}();

exports.Router = Router;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _drawModule = _interopRequireDefault(__webpack_require__(/*! draw-module */ "./node_modules/draw-module/index.js"));

var _transitionEnd = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/transitionEnd */ "./src/layout/js/transitionEnd.js"));

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/animation */ "./src/layout/js/animation.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Categories =
/*#__PURE__*/
function (_Animation) {
  _inherits(Categories, _Animation);

  function Categories() {
    var _this;

    _classCallCheck(this, Categories);

    _this = _possibleConstructorReturn(this, (Categories.__proto__ || Object.getPrototypeOf(Categories)).call(this));
    _this.container = document.querySelector('.categories');
    _this.categories = _this.container.querySelector('.category');
    _this.indicator = _this.container.querySelector('.category__otherCategories-indicator');
    if (!_this.container) return _possibleConstructorReturn(_this);
    _this.pageDraw = new _drawModule.default({
      indication: true,
      position: 'afterbegin .category__dinamic',
      content: function content(data) {
        var head = data.head,
            text = data.text,
            className = data.className;

        var bg = _this.container.querySelector('.category__bg');

        bg.className = "category__bg ".concat(className);
        return "\n\t\t\t\t\t<div class=\"category__head blockName\">".concat(head, "</div>\n\t\t\t\t\t<div class=\"category__text\">\n\t\t\t\t\t\t").concat(text, "\n\t      \t</div>\n\t\t\t\t");
      },
      show: function show() {
        this.block.querySelector('.category__head').classList.add('category__head--animate');
        this.block.querySelector('.category__text').classList.add('category__text--animate');
      }
    });
    _this.imagePageDraw = new _drawModule.default({
      class: 'categories__image',
      position: 'beforebegin .categories__cardsContainer',
      content: function content(data) {
        this.block.style.overflow = 'hidden';
        return "<div style=\"background:url(".concat(data.url || 'images/nano.jpg', ") 50% 50%/cover no-repeat;\n\t\t\t\t \t\t\t\t\t\t\t\t\t\twidth:100%;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\topacity:0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttransform:translateX(40px)\"></div>");
      },
      show: function show() {
        var image = this.block.firstElementChild;
        image.style.transition = 'all .3s ease';
        requestAnimationFrame(function () {
          requestAnimationFrame(function () {
            image.style.opacity = 1;
            image.style.transform = 'translateX(0px)';
          });
        });
      },
      hide: function hide() {
        var _this2 = this;

        return new Promise(function (resolve, reject) {
          var image = _this2.block.firstElementChild;
          image.style.opacity = 0;
          image.style.transform = 'translateX(-40px)';
          new _transitionEnd.default({
            element: image,
            callback: function callback() {
              resolve();
            }
          });
        });
      }
    });
    _this.imagePageDraw.localData = {};
    _this.imagePageDraw.draw;
    _this.pageDraw.child = _this.imagePageDraw;

    _this.togglers();

    _this.bgBallAnimate();

    _this.closeCategories();

    return _this;
  }

  _createClass(Categories, [{
    key: "togglers",
    value: function togglers(category) {
      var _this3 = this;

      this.obj = JSON.parse(this.container.dataset.categories);
      var els = document.querySelectorAll('.category__otherCategories-items li');
      this.setIndicatorPosition(els[0]);
      [].forEach.call(els, function (item, index) {
        item.addEventListener('click', function (event) {
          [].forEach.call(els, function (item, index) {
            item.classList.remove('active');
          });
          item.classList.add('active');
          var width = parseInt(getComputedStyle(item).width);
          _this3.pageDraw.localData = _this3.obj[index];
          _this3.imagePageDraw.localData = _this3.obj[index];
          _this3.pageDraw.draw;

          _this3.setIndicatorPosition(item);
        });
      });
    }
  }, {
    key: "setIndicatorPosition",
    value: function setIndicatorPosition(item) {
      var togglersContainer = this.container.getElementsByClassName('category__otherCategories-items')[0];
      var togglersCoords = togglersContainer.getBoundingClientRect();
      var indicatorCoords = this.indicator.getBoundingClientRect();
      var itemCoords = item.getBoundingClientRect();
      this.indicator.style.position = 'relative';
      this.indicator.style.transition = 'all .3s ease';
      this.indicator.style.width = parseInt(getComputedStyle(item).width) + 'px';
      this.indicator.style.left = itemCoords.left - togglersCoords.left + 'px';
    }
  }, {
    key: "bgBallAnimate",
    value: function bgBallAnimate() {
      var _this4 = this;

      var container = document.querySelector('.category__titleCards');
      var cards = container.querySelectorAll('.category__card');
      [].forEach.call(cards, function (card) {
        card.addEventListener('click', function (event) {
          var containerCoords = container.getBoundingClientRect();
          var div = document.createElement('div');
          div.style.position = 'absolute';
          div.style.borderRadius = '10000px';
          div.style.boxShadow = '0 4px 16px rgba(0,0,0,.1)';
          container.style.overflow = 'hidden';
          container.appendChild(div);
          var classNames = card.className.split(' ');
          var regex = new RegExp('--');
          classNames.forEach(function (item) {
            if (regex.test(item)) {
              classNames = item;
            }
          });

          if (classNames instanceof Array) {
            return;
          }

          div.classList.add(classNames);
          var start = Date.now();
          var left = containerCoords.left,
              top = containerCoords.top,
              right = containerCoords.right,
              bottom = containerCoords.bottom;
          var x = event.x,
              y = event.y;
          x = x - left;
          y = y - top;
          var height = bottom - top;
          var width = right - left;
          var Size = Math.sqrt(Math.pow(height, 2) + Math.pow(width, 2));
          disableActiveIcon();

          var animate = function animate() {
            var progress = _this4.__progress(start, 500);

            var progressSize = Size * progress;
            div.style.width = progressSize + 'px';
            div.style.height = progressSize + 'px';
            var top = y + (height / 2 - y - Size / 2) * progress;
            var left = x + (width / 2 - x - Size / 2) * progress;
            div.style.top = top + 'px';
            div.style.left = left + 'px';

            if (progress === 1) {
              container.style.display = 'none';
              div.remove();

              _this4.fadeIn(document.querySelector('.category__dinamic'), {
                duration: 400
              });

              for (var i = 0; i < _this4.obj.length; i++) {
                if (_this4.obj[i].className == classNames) {
                  var activeItem = document.querySelectorAll('.category__otherCategories-items li')[i];
                  activeItem.classList.add('active');
                  _this4.pageDraw.localData = _this4.obj[i];
                  _this4.imagePageDraw.localData = _this4.obj[i];
                  _this4.pageDraw.draw;

                  _this4.setIndicatorPosition(activeItem);

                  break;
                }
              }

              return;
            }

            requestAnimationFrame(animate);
          };

          requestAnimationFrame(animate);
        });

        function disableActiveIcon() {
          var icons = document.querySelectorAll('.category__otherCategories-items li.active');
          [].forEach.call(icons, function (item) {
            item.classList.remove('active');
          });
        }
      });
    }
  }, {
    key: "closeCategories",
    value: function closeCategories() {
      var _this5 = this;

      var closeButton = document.getElementsByClassName('category__close')[0];
      var cardsContainer = document.getElementsByClassName('category__titleCards')[0];
      var cards = cardsContainer.getElementsByClassName('category__card');
      var matrix2 = [-1, -1, 1, 1];
      var matrix1 = [-1, 1, -1, 1];
      var value = 10;
      closeButton.addEventListener('click', function (event) {
        cardsContainer.style.display = 'block';
        [].forEach.call(cards, function (card, index) {
          card.style.opacity = 0;
          card.style.transform = "translate(".concat(matrix1[index] * value, "%,").concat(matrix2[index] * value, "%)");
          card.style.transition = 'all .3s ease';
          requestAnimationFrame(function () {
            requestAnimationFrame(function () {
              card.style.opacity = 1;
              card.style.transform = 'translate(0%,0%)';
              _this5.imagePageDraw.localData = {};
              _this5.imagePageDraw.draw;
            });
          });
        });
      });
    }
  }]);

  return Categories;
}(_animation.default);

exports.default = Categories;
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvdGl0bGUvanMvcGFuZWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvYW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvYmFja2dyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGF5b3V0L2pzL3RyYW5zaXRpb25FbmQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL3RpdGxlL2pzL3BhZ2VOYXZNZW51LmpzIiwid2VicGFjazovLy8uL3NyYy9wYWdlcy90aXRsZS9qcy9iYWxsLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvY2xpY2suanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xheW91dC9qcy9jdXN0b21MaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZHJhdy1tb2R1bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL3RpdGxlL2pzL2NhdGVnb3JpZXMuanMiXSwibmFtZXMiOlsiUGFuZWxzIiwicGFuZWxzQ29udGFpbmVyIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicGFuZWxzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImxpc3RlbmVycyIsImNvdW50IiwiZm9yRWFjaCIsImNhbGwiLCJpdGVtIiwiY29udGVudCIsImJsYWNrIiwiYmciLCJhZGRFdmVudExpc3RlbmVyIiwiYW5pbU51bWJlciIsInN0eWxlIiwiekluZGV4Iiwic2V0VGltZW91dCIsImRpc3BsYXkiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmUiLCJlbCIsIm9wdGlvbnMiLCJzdG9wIiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZHVyYXRpb24iLCJkZWxheSIsImNhbGxiYWNrIiwiY29udGFpbnMiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJhbmltYXRpb24iLCJwcm9ncmVzcyIsIl9fcHJvZ3Jlc3MiLCJpbml0YWxPcGFjaXR5IiwiX190aW1pbmciLCJNYXRoIiwic2luIiwiYWNvcyIsImJnRWxlbWVudCIsInBhcmVudHMiLCJwYXJhbWV0ZXIiLCJ0cmFuc2l0aW9uZW5kQ2FsbGJhY2siLCJpbml0IiwicGFyc2VJbnQiLCJnZXRDb21wdXRlZFN0eWxlIiwidHJhbnNpdGlvbkVuZCIsIlRyYW5zaXRpb25FbmQiLCJlbGVtZW50IiwiX19hbmltYXRpb25Db3VudCIsIl9fc2hvd2luZyIsImFuaW1hdGlvbk51bWJlciIsIm1lbnVIZWlnaHQiLCJBcnJheSIsImxlbmd0aCIsInZhbHVlIiwiX19oaWRpbmciLCJfX3Nob3dlZCIsImVuZCIsIndpbmRvdyIsImJpbmQiLCJwYXJlbnQiLCJMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJQYWdlTmF2TWVudSIsImNvbnRhaW5lciIsImxpbmtzIiwicXVlcnlTZWxlY3RvckFsbCIsIm1lbnUiLCJtZW51SXRlbXMiLCJCYWNrZ3JvdW5kIiwibG9naWNGcm9tSXRlbSIsImxvZ2ljTmF2UGFuZWwiLCJtZW51QmxvY2tOYW1lIiwiZGF0YXNldCIsImhpZGVCbG9ja3MiLCJsaW5rIiwic2hvdyIsInNsaWRlckxvZ2ljIiwiZWxzIiwidHIiLCJoaWRlIiwic2xpZGVyIiwibWVudUNvb3JkcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpQ29vcmRzIiwid2lkdGgiLCJyaWdodCIsImxlZnQiLCJBbmltYXRpb24iLCJCYWxsIiwiX19iYWxscyIsImEiLCJpbml0QmFsbCIsInNjcm9sbFRvVG9wIiwiTmFtZSIsImNsaWNrQmFsbCIsImZuIiwiZXZlbnQiLCJ0YXJnZXQiLCJjbG9zZXN0Iiwid2luZG93V2lkdGgiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImJvZHkiLCJvdmVyZmxvdyIsInNjcm9sbEJhciIsInJlc2l6ZUxpc3RlbmVyIiwiQ3VzdG9tTGlzdGVuZXIiLCJsaXN0ZW5lciIsIm9mZnNldFdpZHRoIiwieCIsInkiLCJzY3JvbGwiLCJwYWdlWU9mZnNldCIsImNsb3NlIiwidG9wIiwib3BlbkNvbnRhaW5lciIsInZpZGVvU2V0dGluZ3MiLCJjbGllbnRIZWlnaHQiLCJTaXplIiwic3FydCIsImFuaW1hdGUiLCJwcm9ncmVzc1NpemUiLCJoZWlnaHQiLCJjbG9zZUNsaWNrTGlzdGVuZXIiLCJDbGljayIsImNsb3NlQ29udGFpbmVyIiwibmV3U2Nyb2xsIiwidmlkZW8iLCJwYXVzZSIsInZpZGVvTGlzdGVuZXJzIiwiaWZyYW1lIiwibmV4dEVsIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwicGFyZW50Tm9kZSIsImluc2VydEJlZm9yZSIsInN0b3BCdXR0b24iLCJwbGF5IiwidGhlbiIsInRvZ2dsZVBsYXkiLCJzdGF0dXMiLCJwdXNoIiwidmlkZW9TZXRQcm9ncmVzcyIsImUiLCJ3aGljaCIsImNsaWNrUHJvZ3Jlc3MiLCJjdXJyZW50VGltZSIsIm11dGUiLCJtdXRlZCIsImNhdGNoIiwiY29uc29sZSIsImxvZyIsInBhcmVudEVsZW1lbnQiLCJhY3R1YWxQcm9ncmVzcyIsImFjdHVhbFRpbWUiLCJhY3R1YWxUaW1lX21pbnV0ZXMiLCJhY3R1YWxUaW1lX3NlY29uZHMiLCJmdWxsVGltZSIsImZ1bGxUaW1lX21pbnV0ZXMiLCJmdWxsVGltZV9zZWNvbmRzIiwiZnVsbE1pbiIsImZ1bGxTZWMiLCJ0ZXh0Q29udGVudCIsImFjdHVhbE1pbiIsImFjdHVhbFNlYyIsInRyYW5zaXRpb24iLCJQYWdlRHJhdyIsImlkIiwicmFuZG9tIiwiX19kYXRhIiwiZGF0YSIsImNhY2hlIiwibG9jYWxEYXRhIiwicG9zaXRpb24iLCJfX2VsZW1lbnQiLCJfX2NsYXNzTmFtZSIsImNsYXNzIiwiX19pbmRpY2F0aW9uIiwiaW5kaWNhdGlvbiIsIl9fY29udCIsIl9fY2FsbGJhY2siLCJfX3ByZXJlbmRlciIsIl9fZHJhd2VkIiwiYmxvY2siLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiY2hpbGRyZW5BcnJheSIsIl9fY2hhbmdlZENhY2hlIiwiY2hpbGRyZW5IaWRlTW9kdWxlcyIsIm9iamVjdCIsImkiLCJjaGlsZCIsImRldmVsb3BtZW50IiwiX19kcmF3U3RhcnQiLCJFcnJvciIsIkZ1bmN0aW9uIiwiX19kcmF3Rm9yRnVuY3Rpb24iLCJfX2RyYXdGb3JTdHJpbmciLCJlcnJvciIsInVybCIsImNhY2hlQ29udHJvbCIsInJlc3VsdCIsIndhcm4iLCJpbm5lckhUTUwiLCJpbnNlcnRDb250IiwiZXJyIiwiYXJyYXkiLCJpbmRleCIsInBsYWNlIiwiZmF0aGVyIiwic2VhcmNoRWxlbWVudCIsImluc2VydEFkamFjZW50RWxlbWVudCIsImRyYXdlZCIsInByZWxvYWQiLCJsb2FkaW5nIiwibG9hZERhdGEiLCJyZXF1ZXN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJtZXRob2QiLCJvcGVuIiwicHJvbWlzZSIsIm9ubG9hZCIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJjb2RlIiwiaXNDaGlsZHJlbiIsIl9fcG9zIiwiT2JqZWN0IiwiYXJyIiwic3BsaXQiLCJjaGFuZ2VkQ2hpbGRyZW5zIiwiZHJhdyIsIl9fZHJhd0xvZ2ljIiwiY2hpbGRyZW4iLCJkZWxldGUiLCJhbGwiLCJzdGFjayIsIl9fbG9jYWxEYXRhIiwiUm91dGVyIiwic3RydWN0dXJlIiwicm91dGUiLCJfX3BhcnNlIiwicmVtb3ZlQ2hpbGRyZW4iLCJzdWJqZWN0cyIsImFjdGl2ZVN0cnVjdHVyZSIsImFjdGl2ZUVsZW1lbnRzIiwibmV3RWxlbWVudHMiLCJfX3BhcnNlRm9yRGVsZXRlIiwicSIsInBhZ2VzIiwiaHJlZiIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJzY3JvbGxUbyIsInRhZ05hbWUiLCJnZXRBdHRyaWJ1dGUiLCJwcmV2ZW50RGVmYXVsdCIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJzdGF0ZSIsIkNhdGVnb3JpZXMiLCJjYXRlZ29yaWVzIiwiaW5kaWNhdG9yIiwicGFnZURyYXciLCJoZWFkIiwidGV4dCIsImltYWdlUGFnZURyYXciLCJpbWFnZSIsImZpcnN0RWxlbWVudENoaWxkIiwidG9nZ2xlcnMiLCJiZ0JhbGxBbmltYXRlIiwiY2xvc2VDYXRlZ29yaWVzIiwiY2F0ZWdvcnkiLCJvYmoiLCJzZXRJbmRpY2F0b3JQb3NpdGlvbiIsInRvZ2dsZXJzQ29udGFpbmVyIiwidG9nZ2xlcnNDb29yZHMiLCJpbmRpY2F0b3JDb29yZHMiLCJpdGVtQ29vcmRzIiwiY2FyZHMiLCJjYXJkIiwiY29udGFpbmVyQ29vcmRzIiwiZGl2IiwiYm9yZGVyUmFkaXVzIiwiYm94U2hhZG93IiwiYXBwZW5kQ2hpbGQiLCJjbGFzc05hbWVzIiwicmVnZXgiLCJSZWdFeHAiLCJ0ZXN0IiwiYm90dG9tIiwiZGlzYWJsZUFjdGl2ZUljb24iLCJmYWRlSW4iLCJhY3RpdmVJdGVtIiwiaWNvbnMiLCJjbG9zZUJ1dHRvbiIsImNhcmRzQ29udGFpbmVyIiwibWF0cml4MiIsIm1hdHJpeDEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7SUFBcUJBLE07OztBQUNwQixvQkFBYTtBQUFBOztBQUNaLFNBQUtDLGVBQUwsR0FBdUJDLFNBQVNDLGFBQVQsQ0FBdUIsU0FBdkIsQ0FBdkI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsS0FBS0gsZUFBTCxDQUFxQkksc0JBQXJCLENBQTRDLE9BQTVDLENBQWQ7QUFFQSxTQUFLQyxTQUFMO0FBQ0E7Ozs7Z0NBRVU7QUFDVixVQUFJQyxRQUFRLENBQVo7QUFDQSxTQUFHQyxPQUFILENBQVdDLElBQVgsQ0FBZ0IsS0FBS0wsTUFBckIsRUFBNEIsVUFBQ00sSUFBRCxFQUFRO0FBRW5DLFlBQU1DLFVBQVVELEtBQUtQLGFBQUwsQ0FBbUIsaUJBQW5CLENBQWhCO0FBQ0EsWUFBTVMsUUFBUUYsS0FBS1AsYUFBTCxDQUFtQixvQkFBbkIsQ0FBZDtBQUNBLFlBQU1VLEtBQUtILEtBQUtQLGFBQUwsQ0FBbUIseUJBQW5CLENBQVg7QUFFQU8sYUFBS0ksZ0JBQUwsQ0FBdUIsWUFBdkIsRUFBcUMsaUJBQVM7QUFDN0MsY0FBTUMsYUFBYSxFQUFFUixLQUFyQjtBQUVBRyxlQUFLTSxLQUFMLENBQVdDLE1BQVgsR0FBb0IsQ0FBcEI7QUFHQUMscUJBQVcsWUFBWTtBQUN0QixnQkFBSUgsZUFBZVIsS0FBbkIsRUFBMEI7QUFDMUJJLHdCQUFZQSxRQUFRSyxLQUFSLENBQWNHLE9BQWQsR0FBd0IsT0FBcEM7QUFDQUMsa0NBQXVCLFlBQU07QUFDM0JBLG9DQUF1QixZQUFNO0FBQzdCVixxQkFBS1csU0FBTCxDQUFlQyxHQUFmLENBQW1CLGVBQW5CO0FBQ0MsZUFGRDtBQUdELGFBSkQ7QUFNQSxXQVRELEVBU0csR0FUSDtBQVdBLFNBakJEO0FBbUJBWixhQUFLSSxnQkFBTCxDQUF1QixZQUF2QixFQUFxQyxpQkFBUztBQUM3Q1A7QUFFQUcsZUFBS1csU0FBTCxDQUFlRSxNQUFmLENBQXNCLGVBQXRCO0FBQ0FiLGVBQUtNLEtBQUwsQ0FBV0MsTUFBWCxHQUFvQixFQUFwQjtBQUNBQyxxQkFBVyxZQUFZO0FBQ3RCUCx3QkFBWUEsUUFBUUssS0FBUixDQUFjRyxPQUFkLEdBQXdCLEVBQXBDO0FBQ0EsV0FGRCxFQUVHLEdBRkg7QUFHQSxTQVJEO0FBU0EsT0FsQ0Q7QUFvQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QWVyVCxzQkFBZixDQUFzQyxnQkFBdEMsQ0FBZDtBQUVBLFVBQU1zVCxVQUFVLENBQ2YsQ0FBQyxDQURjLEVBQ1gsQ0FBQyxDQURVLEVBRWQsQ0FGYyxFQUVWLENBRlUsQ0FBaEI7QUFJQSxVQUFNQyxVQUFVLENBQ2YsQ0FBQyxDQURjLEVBQ1gsQ0FEVyxFQUVmLENBQUMsQ0FGYyxFQUVYLENBRlcsQ0FBaEI7QUFJQSxVQUFNMVAsUUFBUSxFQUFkO0FBRUF1UCxrQkFBWTNTLGdCQUFaLENBQThCLE9BQTlCLEVBQXVDLGlCQUFTO0FBQy9DNFMsdUJBQWUxUyxLQUFmLENBQXFCRyxPQUFyQixHQUErQixPQUEvQjtBQUVBLFdBQUdYLE9BQUgsQ0FBV0MsSUFBWCxDQUFnQmdTLEtBQWhCLEVBQXVCLFVBQUNDLElBQUQsRUFBTy9FLEtBQVAsRUFBaUI7QUFDdkMrRSxlQUFLMVIsS0FBTCxDQUFXa0IsT0FBWCxHQUFxQixDQUFyQjtBQUNBd1EsZUFBSzFSLEtBQUwsQ0FBV21CLFNBQVgsdUJBQW9DeVIsUUFBUWpHLEtBQVIsSUFBaUJ6SixLQUFyRCxlQUErRHlQLFFBQVFoRyxLQUFSLElBQWlCekosS0FBaEY7QUFDQXdPLGVBQUsxUixLQUFMLENBQVdpSyxVQUFYLEdBQXdCLGNBQXhCO0FBRUE3SixnQ0FBdUIsWUFBTTtBQUM1QkEsa0NBQXVCLFlBQU07QUFDNUJzUixtQkFBSzFSLEtBQUwsQ0FBV2tCLE9BQVgsR0FBcUIsQ0FBckI7QUFDQXdRLG1CQUFLMVIsS0FBTCxDQUFXbUIsU0FBWCxHQUF1QixrQkFBdkI7QUFDQSxxQkFBS3lQLGFBQUwsQ0FBbUJwRyxTQUFuQixHQUErQixFQUEvQjtBQUNBLHFCQUFLb0csYUFBTCxDQUFtQm5DLElBQW5CO0FBQ0EsYUFMRDtBQU1BLFdBUEQ7QUFRQSxTQWJEO0FBY0EsT0FqQkQ7QUFrQkE7Ozs7RUEzT3NDckosa0IiLCJmaWxlIjoiY3NzL3RpdGxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhbmVscyB7XG5cdGNvbnN0cnVjdG9yKCl7XG5cdFx0dGhpcy5wYW5lbHNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFuZWxzJyk7XG5cdFx0dGhpcy5wYW5lbHMgPSB0aGlzLnBhbmVsc0NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwYW5lbCcpO1xuXG5cdFx0dGhpcy5saXN0ZW5lcnMoKTtcblx0fVxuXG5cdGxpc3RlbmVycygpe1xuXHRcdGxldCBjb3VudCA9IDA7XG5cdFx0W10uZm9yRWFjaC5jYWxsKHRoaXMucGFuZWxzLChpdGVtKT0+e1xuXG5cdFx0XHRjb25zdCBjb250ZW50ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcucGFuZWxfX2NvbnRlbnQnKTtcblx0XHRcdGNvbnN0IGJsYWNrID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcucGFuZWxfX2JsYWNrQmxvY2snKTtcblx0XHRcdGNvbnN0IGJnID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcucGFuZWxfX2JhY2tncm91bmRCbG9jaycpO1xuXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgZXZlbnQgPT4ge1xuXHRcdFx0XHRjb25zdCBhbmltTnVtYmVyID0gKytjb3VudDtcblxuXHRcdFx0XHRpdGVtLnN0eWxlLnpJbmRleCA9IDI7XG5cblxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZiAoYW5pbU51bWJlciAhPT0gY291bnQpIHJldHVybjtcblx0XHRcdFx0XHRjb250ZW50ICYmIChjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snKTtcblx0XHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0XHQgXHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0XHRcdFx0aXRlbS5jbGFzc0xpc3QuYWRkKCdwYW5lbC0tYWN0aXZlJyk7XG5cdFx0XHRcdFx0IFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fSwgNDAwKTtcblxuXHRcdFx0fSk7XG5cblx0XHRcdGl0ZW0uYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCBldmVudCA9PiB7XG5cdFx0XHRcdGNvdW50Kys7XG5cblx0XHRcdFx0aXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdwYW5lbC0tYWN0aXZlJyk7XG5cdFx0XHRcdGl0ZW0uc3R5bGUuekluZGV4ID0gJyc7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGNvbnRlbnQgJiYgKGNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICcnKTtcblx0XHRcdFx0fSwgMzAwKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXG5cdGZhZGVJbihlbCxvcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0bGV0IHN0b3AgPSBmYWxzZTtcblxuXHRcdGRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdmYWRlSW4nLHtkZXRhaWw6ZWx9KSk7XG5cblx0XHRsZXQge2R1cmF0aW9uID0gNDAwLGRlbGF5ID0gMCxjYWxsYmFja30gPSBvcHRpb25zO1xuXG5cdFx0aWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnZmFkZUluJykpIHJldHVybjtcblx0XHRlbC5jbGFzc0xpc3QuYWRkKCdmYWRlSW4nKTtcblxuXHRcdGVsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cdFx0ZWwuc3R5bGUub3BhY2l0eSA9IDA7XG5cdFx0ZWwuc3R5bGUudHJhbnNmb3JtID0nIHRyYW5zbGF0ZVkoLTEwJSknO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuXHRcdFx0bGV0IHN0YXJ0ID0gRGF0ZS5ub3coKSArIGRlbGF5O1xuXG5cdFx0XHRsZXQgYW5pbWF0aW9uID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAoRGF0ZS5ub3coKSA8IHN0YXJ0KSB7XG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRpb24gKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHN0b3ApIHJldHVybjtcblx0XHRcdFx0bGV0IHByb2dyZXNzID0gdGhpcy5fX3Byb2dyZXNzKHN0YXJ0LCBkdXJhdGlvbik7XG5cdFx0XHRcdGVsLnN0eWxlLm9wYWNpdHkgPSAxICogcHJvZ3Jlc3M7XG5cdFx0XHRcdGVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7LTEwICogKDEgLSBwcm9ncmVzcyl9JSlgO1xuXG5cdFx0XHRcdGlmIChwcm9ncmVzcyA9PT0gMSkge1xuXHRcdFx0XHRcdC8vIGNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0aW9uICk7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbiApO1xuXHRcdH0pO1xuXHR9XG5cblx0ZmFkZU91dChlbCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGxldCBzdG9wID0gZmFsc2U7XG5cblx0XHRkaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZmFkZU91dCcse2RldGFpbDplbH0pKTtcblxuXHRcdGxldCB7ZHVyYXRpb24gPSA0MDAsZGVsYXkgPSAwLGNhbGxiYWNrfSA9IG9wdGlvbnM7XG5cblx0XHRjb25zdCBpbml0YWxPcGFjaXR5ID0gZWwuc3R5bGUub3BhY2l0eSB8fCAxO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuXHRcdFx0bGV0IHN0YXJ0ID0gRGF0ZS5ub3coKSArIGRlbGF5O1xuXG5cdFx0XHRsZXQgYW5pbWF0aW9uID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAoRGF0ZS5ub3coKSA8IHN0YXJ0KSB7XG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRpb24gKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHN0b3ApIHJldHVybjtcblx0XHRcdFx0bGV0IHByb2dyZXNzID0gdGhpcy5fX3Byb2dyZXNzKHN0YXJ0LCBkdXJhdGlvbik7XG5cdFx0XHRcdGVsLnN0eWxlLm9wYWNpdHkgPSBpbml0YWxPcGFjaXR5IC0gMSAqIHByb2dyZXNzO1xuXHRcdFx0XHRlbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgkey0xMCAqIHByb2dyZXNzfSUpYDtcblxuXHRcdFx0XHRpZiAocHJvZ3Jlc3MgPT09IDEpIHtcblx0XHRcdFx0XHQvLyBjYWxsYmFjaygpO1xuXHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZhZGVJbicpO1xuXHRcdFx0XHRcdGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcblx0XHRcdFx0XHRlbC5zdHlsZS5vcGFjaXR5ID0gJyc7XG5cdFx0XHRcdFx0ZWwuc3R5bGUudHJhbnNmb3JtID0nJztcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0aW9uICk7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbiApO1xuXHRcdH0pO1xuXHR9XG5cblx0X19wcm9ncmVzcyhzdGFydCwgZHVyYXRpb24pIHtcblx0XHRsZXQgcHJvZ3Jlc3MgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0KS9kdXJhdGlvbjtcblx0XHRpZiAocHJvZ3Jlc3MgPiAxKSBwcm9ncmVzcyA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5fX3RpbWluZyhwcm9ncmVzcyk7XG5cdH1cblxuXHRfX3RpbWluZyhwcm9ncmVzcykge1xuXHRcdHJldHVybiBNYXRoLnNpbihNYXRoLmFjb3MocHJvZ3Jlc3MqKjEuNCAtIDEpKTtcblx0fVxufVxuIiwiaW1wb3J0IFRyYW5zaXRpb25FbmQgZnJvbSAnLi90cmFuc2l0aW9uRW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHQvLyDQv9C10YDQtdC00LDQtdGC0YHRjyDRjdC70LXQvNC10L3RgiDQutC+0YLQvtGA0YvQuSDQv9C+0LrQsNC30YvQstCw0LXRgtGB0Y8v0YHQutGA0YvQstCw0LXRgtGB0Y8g0Lgg0Y3Qu9C10LzQtdC90YLRiywg0LrQvtGC0L7RgNGL0LUg0L3QsNC00L4g0LfQsNC60YDRi9GC0Ywg0L/QsNGA0LDQvNC10YLRgNC+0LwgXCLQstGL0YHQvtGC0LBcIlxuXHRjb25zdHJ1Y3RvcihiZ0VsZW1lbnQsIHBhcmVudHMsIHBhcmFtZXRlciwgdHJhbnNpdGlvbmVuZENhbGxiYWNrKSB7XG5cdFx0dGhpcy5lbCA9IGJnRWxlbWVudDtcblx0XHR0aGlzLnBhcmVudHMgPSBwYXJlbnRzIHx8IHRoaXMuZWw7XG5cdFx0dGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7XG5cdFx0dGhpc1t0aGlzLnBhcmFtZXRlcl0gPSB7XG5cdFx0XHRpbml0OiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpW3RoaXMucGFyYW1ldGVyXSlcblx0XHR9XG5cdFx0aWYgKHRyYW5zaXRpb25lbmRDYWxsYmFjaylcblx0XHRcdHRoaXMudHJhbnNpdGlvbkVuZCA9IG5ldyBUcmFuc2l0aW9uRW5kKHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy5lbCxcblx0XHRcdFx0Y2FsbGJhY2s6IHRyYW5zaXRpb25lbmRDYWxsYmFja1xuXHRcdFx0fSlcblxuXHRcdHRoaXMuX19hbmltYXRpb25Db3VudCA9IDA7XG5cdH1cblxuXHRzaG93KCl7XG5cblx0XHR0aGlzLl9fc2hvd2luZyA9IHRydWU7XG5cblx0XHR0aGlzW3RoaXMucGFyYW1ldGVyXS5zdGFydCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy5lbClbdGhpcy5wYXJhbWV0ZXJdKSB8fCAwO1xuXHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gdGhpc1t0aGlzLnBhcmFtZXRlcl0uc3RhcnQgKyAncHgnO1xuXG5cdFx0bGV0IGFuaW1hdGlvbk51bWJlciA9IHRoaXMuX19hbmltYXRpb25Db3VudCsrO1xuXHRcdHRoaXMuZWwuc3R5bGVbJ3RyYW5zaXRpb24nXSA9ICdoZWlnaHQgLjNzIGVhc2UnO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0bGV0IG1lbnVIZWlnaHQgPSAwO1xuXG5cdFx0XHRcdGlmICh0aGlzLnBhcmVudHMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRpZiAoIHRoaXMucGFyZW50cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0bWVudUhlaWdodCA9IHBhcnNlSW50KCBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50c1swXSlbdGhpcy5wYXJhbWV0ZXJdKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5wYXJlbnRzLmZvckVhY2goIGl0ZW0gPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgdmFsdWUgPSBwYXJzZUludCggZ2V0Q29tcHV0ZWRTdHlsZShpdGVtKVt0aGlzLnBhcmFtZXRlcl0gKVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gdmFsdWUpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0bWVudUhlaWdodCArPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bWVudUhlaWdodCA9IHBhcnNlSW50KCBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50cylbdGhpcy5wYXJhbWV0ZXJdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gbWVudUhlaWdodCArICdweCc7XG5cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGhpZGUoKXtcblx0XHR0aGlzLl9faGlkaW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZWwuc3R5bGVbJ3RyYW5zaXRpb24nXSA9ICdoZWlnaHQgLjNzIGVhc2UgLjJzJztcblxuXHRcdGlmICghdGhpcy5fX3Nob3dpbmcgJiYgIXRoaXMuX19zaG93ZWQpIHJldHVybjtcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXG5cdFx0XHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gJzBweCc7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRyZW1vdmVDYWxsYmFjaygpe1xuXHRcdHRoaXMudHJhbnNpdGlvbkVuZCAmJiB0aGlzLnRyYW5zaXRpb25FbmQuZW5kKCk7XG5cdH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zaXRpb25FbmQge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0dGhpcy5lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50IHx8IHdpbmRvdztcblx0XHR0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjay5iaW5kKHRoaXMpO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQgfHwgbnVsbDtcblxuXHRcdHRoaXMuTGlzdGVuZXIoKTtcblx0fVxuXG5cdExpc3RlbmVyKCkge1xuXHRcdHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJyx0aGlzLmNhbGxiYWNrKTtcblx0fVxuXG5cdGVuZCgpIHtcblx0XHR0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsdGhpcy5jYWxsYmFjayk7XG5cdH1cbn1cbiIsImltcG9ydCBBbmltYXRpb24gZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL2FuaW1hdGlvbic7XG5pbXBvcnQgQmFja2dyb3VuZCBmcm9tICcuLi8uLi8uLi9sYXlvdXQvanMvYmFja2dyb3VuZCc7XG5pbXBvcnQgVHJhbnNpdGlvbkVuZCBmcm9tICcuLi8uLi8uLi9sYXlvdXQvanMvdHJhbnNpdGlvbkVuZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VOYXZNZW51IGV4dGVuZHMgQW5pbWF0aW9uIHtcblx0Y29uc3RydWN0b3IoKXtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb250YWluZXJfX3BhZ2VOYXYnKVswXTtcblx0XHR0aGlzLmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncGFnZU5hdicpWzBdO1xuXHRcdHRoaXMubGlua3MgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYWdlTmF2X19saSBhJyk7XG5cdFx0dGhpcy5tZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncGFnZU5hdl9fbWVudScpWzBdO1xuXG5cdFx0bGV0IG1lbnVJdGVtcyA9IHRoaXMubWVudS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tZW51LWJsb2NrLW5hbWVdJyk7XG5cblx0XHR0aGlzLmJnID0gbmV3IEJhY2tncm91bmQoXG5cdFx0XHQgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncGFnZU5hdl9fYmcnKVswXSxcblx0XHRcdFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyX19wYWdlTmF2IC5jb250YWluZXInKSwgLi4ubWVudUl0ZW1zXSxcblx0XHRcdCdoZWlnaHQnXG5cdFx0KTtcblxuXHRcdFtdLmZvckVhY2guY2FsbCh0aGlzLmxpbmtzLChpdGVtKT0+e1xuXHRcdFx0dGhpcy5sb2dpY0Zyb21JdGVtKGl0ZW0pO1xuXHRcdH0pO1xuXHRcdHRoaXMubG9naWNOYXZQYW5lbCgpO1xuXG5cdH1cblxuXG5cdGxvZ2ljRnJvbUl0ZW0oaXRlbSl7XG5cdFx0bGV0IG1lbnVCbG9ja05hbWUgPSBpdGVtLmRhdGFzZXQubWVudUJsb2NrTmFtZTtcblx0XHRsZXQgZWwgPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvcihgW2RhdGEtbWVudS1ibG9jay1uYW1lPVwiJHttZW51QmxvY2tOYW1lfVwiXWApO1xuXG5cdFx0aXRlbS5hZGRFdmVudExpc3RlbmVyKCAnbW91c2VlbnRlcicsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMuaGlkZUJsb2NrcyhlbCk7XG5cdFx0XHRbXS5mb3JFYWNoLmNhbGwodGhpcy5saW5rcywobGluayk9Pntcblx0XHRcdFx0bGluay5jbGFzc0xpc3QucmVtb3ZlKCctLWFjdGl2ZScpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdwYWdlTmF2X19vcGVuZWQnKTtcblx0XHRcdGl0ZW0uY2xhc3NMaXN0LmFkZCgnLS1hY3RpdmUnKTtcblx0XHRcdGlmICghZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYWRlSW4nKSlcblx0XHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZSgnLS1hY3RpdmUnKTtcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXHRcdFx0IFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XG5cblx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuYWRkKCctLWFjdGl2ZScpO1xuXHRcdFx0IFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5iZy5zaG93KCk7XG5cdFx0XHR0aGlzLnNsaWRlckxvZ2ljKGl0ZW0pO1xuXG5cdFx0XHRlbC5jbGFzc0xpc3QuYWRkKCdmYWRlSW4nKTtcblx0XHRcdGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdH0pO1xuXHR9XG5cblx0aGlkZUJsb2NrcyhlbCkge1xuXHRcdGxldCBlbHMgPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvckFsbChgLmZhZGVJbltkYXRhLW1lbnUtYmxvY2stbmFtZV1gKTtcblxuXHRcdFtdLmZvckVhY2guY2FsbChlbHMsKGl0ZW0pPT57XG5cdFx0XHRpZiAoZWwgJiYgaXRlbSA9PSBlbCkgcmV0dXJuO1xuXHRcdFx0aXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlSW4nKTtcblx0XHRcdGl0ZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHR9KTtcblxuXHR9XG5cblx0bG9naWNOYXZQYW5lbCgpe1xuXHRcdHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWxlYXZlJywgZXZlbnQgPT4ge1xuXG5cdFx0XHRsZXQgZWxzID0gdGhpcy5tZW51LnF1ZXJ5U2VsZWN0b3JBbGwoYC5mYWRlSW5bZGF0YS1tZW51LWJsb2NrLW5hbWVdYCk7XG5cblx0XHRcdFtdLmZvckVhY2guY2FsbChlbHMsKGl0ZW0pPT57XG5cblx0XHRcdFx0aXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlSW4nKTtcblx0XHRcdFx0aXRlbS5jbGFzc0xpc3QucmVtb3ZlKCctLWFjdGl2ZScpO1xuXHRcdFx0XHRsZXQgdHIgPSBuZXcgVHJhbnNpdGlvbkVuZCh7XG5cdFx0XHRcdFx0ZWxlbWVudDogaXRlbSxcblx0XHRcdFx0XHRjYWxsYmFjazogKCk9Pntcblx0XHRcdFx0XHRcdGl0ZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpdGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdFx0dHIuZW5kKCk7XG5cdFx0XHRcdH0sIDMwMCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYmcuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdwYWdlTmF2X19vcGVuZWQnKTtcblx0XHR9KTtcblx0fVxuXG5cdHNsaWRlckxvZ2ljKGl0ZW0pe1xuXHRcdGxldCBzbGlkZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwYWdlTmF2X19pbmRpY2F0b3Itc2xpZGVyJylbMF07XG5cdFx0bGV0IG1lbnVDb29yZHMgPSB0aGlzLm1lbnUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0bGV0IGxpQ29vcmRzID0gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRsZXQgd2lkdGggPSBsaUNvb3Jkcy5yaWdodCAtIGxpQ29vcmRzLmxlZnQ7XG5cblx0XHRzbGlkZXIuc3R5bGUubGVmdCA9IGxpQ29vcmRzLmxlZnQgLSBtZW51Q29vcmRzLmxlZnQgKyAncHgnO1xuXHRcdHNsaWRlci5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4Jztcblx0fVxuXG59XG4iLCJpbXBvcnQgQW5pbWF0aW9uIGZyb20gJy4uLy4uLy4uL2xheW91dC9qcy9hbmltYXRpb24uanMnO1xuaW1wb3J0IENsaWNrIGZyb20gJy4uLy4uLy4uL2xheW91dC9qcy9jbGljay5qcyc7XG5pbXBvcnQgQ3VzdG9tTGlzdGVuZXIgZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL2N1c3RvbUxpc3RlbmVyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFsbCBleHRlbmRzIEFuaW1hdGlvbiB7XG5cdGNvbnN0cnVjdG9yKCl7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX19iYWxscyA9IHt9O1xuXG5cdFx0bGV0IGEgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2xpY2stYmFsbF0nKV07XG5cblx0XHRhLmZvckVhY2goIGl0ZW0gPT4gdGhpcy5pbml0QmFsbChpdGVtKSApO1xuICB9XG5cblx0aW5pdEJhbGwoIGl0ZW0sIHNjcm9sbFRvVG9wID0gdHJ1ZSApIHtcblx0XHRjb25zdCBOYW1lID0gaXRlbS5kYXRhc2V0LmNsaWNrQmFsbDtcblx0XHRsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYmFsbC1jbGljaz1cIiR7TmFtZX1cIl1gKTtcblx0XHRsZXQgYmcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2Jyk7XG5cblx0XHRsZXQgZm4gPSAoZXZlbnQpID0+IHtcblxuXHRcdFx0aWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcubmV3c0NhcmRfX3RhZycpKSB7XG5cdFx0XHRcdHJldHVyblxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgd2luZG93V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4Jztcblx0XHRcdGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0XHRcdGxldCBzY3JvbGxCYXIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSB3aW5kb3dXaWR0aDtcblx0XHRcdHRoaXMucmVzaXplTGlzdGVuZXIgPSBuZXcgQ3VzdG9tTGlzdGVuZXIoe1xuXHRcdFx0XHRsaXN0ZW5lcjogJ3Jlc2l6ZScsXG5cdFx0XHRcdGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCAtIHNjcm9sbEJhciArICdweCc7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bGV0IHt4LCB5fSA9IGV2ZW50O1xuXHRcdFx0bGV0IHNjcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldDtcblxuXHRcdFx0dGhpcy5fX2JhbGxzW05hbWVdID0ge1xuXHRcdFx0XHRjb250YWluZXIsXG5cdFx0XHRcdGJnLFxuXHRcdFx0XHRjbG9zZTpjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtYmFsbC1jbG9zZV0nKSxcblx0XHRcdFx0c2Nyb2xsLFxuXHRcdFx0XHR4LFxuXHRcdFx0XHR5XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0Y29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0XHRjb250YWluZXIuc3R5bGUudG9wID0geSArICdweCc7XG5cdFx0XHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0geCArICdweCc7XG5cdFx0XHRcdGJnLnN0eWxlLmxlZnQgPSAteCArICdweCc7XG5cdFx0XHRcdGJnLnN0eWxlLnRvcCA9IC15ICsgJ3B4JztcblxuXHRcdFx0XHRpZiAoIHNjcm9sbFRvVG9wICkge1xuXHRcdFx0XHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnc2Nyb2xsVG9Ub3AnKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLm9wZW5Db250YWluZXIoIE5hbWUgKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy52aWRlb1NldHRpbmdzKCBOYW1lICk7XG5cblx0XHR9O1xuXG5cdFx0aXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZuKTtcblxuXHRcdHJldHVybiBmbjtcblx0fVxuXG5cdG9wZW5Db250YWluZXIoTmFtZSl7XG5cblx0XHRjb25zdCB7Y29udGFpbmVyLCB4LCB5LCBiZywgc2Nyb2xsLCBjbG9zZX0gPSB0aGlzLl9fYmFsbHNbTmFtZV07XG5cblx0XHRjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgfSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXHRcdGNvbnN0IFNpemUgPSBNYXRoLnNxcnQoY2xpZW50V2lkdGggKiogMiArIGNsaWVudEhlaWdodCAqKiAyKSAqIDI7XG5cblx0XHRjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuXG5cdFx0XHRjb25zdCBwcm9ncmVzcyA9IHRoaXMuX19wcm9ncmVzcyhzdGFydCwxMDAwKTtcblx0XHRcdGNvbnN0IHByb2dyZXNzU2l6ZSA9IFNpemUgKiBwcm9ncmVzcztcblxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLndpZHRoID0gcHJvZ3Jlc3NTaXplICsgJ3B4Jztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXG5cdFx0XHRsZXQgdG9wID0geSArICgoY2xpZW50SGVpZ2h0LzIgLSB5KSAtIFNpemUvMikgKiBwcm9ncmVzcztcblx0XHRcdGxldCBsZWZ0ID0geCArICgoY2xpZW50V2lkdGgvMiAtIHgpIC0gU2l6ZS8yKSAqIHByb2dyZXNzO1xuXG5cdFx0XHRjb250YWluZXIuc3R5bGUudG9wID0gdG9wICsgJ3B4Jztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG5cdFx0XHRiZy5zdHlsZS50b3AgPSAtdG9wICsgJ3B4Jztcblx0XHRcdGJnLnN0eWxlLmxlZnQgPSAtbGVmdCArICdweCc7XG5cblx0XHRcdGlmIChwcm9ncmVzcyA9PT0gMSkge1xuXHRcdFx0XHRjb25zdCBjbG9zZUNsaWNrTGlzdGVuZXIgPSBuZXcgQ2xpY2soe1xuXHRcdFx0XHRcdGVsZW1lbnQ6IGNsb3NlLFxuXHRcdFx0XHRcdGNhbGxiYWNrOiAoKT0+e1xuXHRcdFx0XHRcdFx0dGhpcy5jbG9zZUNvbnRhaW5lcihOYW1lKTtcblx0XHRcdFx0XHRcdGNsb3NlQ2xpY2tMaXN0ZW5lci5lbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdFx0fTtcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdH1cblxuXHRjbG9zZUNvbnRhaW5lcihOYW1lKXtcblx0XHRjb25zdCBuZXdTY3JvbGwgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0Y29uc3Qge2NvbnRhaW5lciwgc2Nyb2xsLCBjbG9zZSwgYmcsIHZpZGVvfSA9IHRoaXMuX19iYWxsc1tOYW1lXTtcblx0XHRpZiAodmlkZW8pIHtcblx0XHRcdHZpZGVvLnBhdXNlKCk7XG5cdFx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzLmZvckVhY2goIGl0ZW0gPT4ge1xuXHRcdFx0XHRpdGVtLmVuZCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGxldCB7eCwgeX0gPSB0aGlzLl9fYmFsbHNbTmFtZV07XG5cblx0XHR5ID0gc2Nyb2xsICsgeSAtIG5ld1Njcm9sbDtcblxuXHRcdGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuXHRcdGNvbnN0IHsgY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCB9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Y29uc3QgU2l6ZSA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKS53aWR0aCk7XG5cblx0XHRjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuXG5cdFx0XHRjb25zdCBwcm9ncmVzcyA9IDEgLSB0aGlzLl9fcHJvZ3Jlc3Moc3RhcnQsNTAwKTtcblx0XHRcdGNvbnN0IHByb2dyZXNzU2l6ZSA9IFNpemUgKiBwcm9ncmVzcztcblxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLndpZHRoID0gcHJvZ3Jlc3NTaXplICsgJ3B4Jztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXHRcdFx0bGV0IHRvcCA9IHkgKyAoKGNsaWVudEhlaWdodC8yIC0geSkgLSBTaXplLzIpICogcHJvZ3Jlc3M7XG5cdFx0XHRsZXQgbGVmdCA9IHggKyAoKGNsaWVudFdpZHRoLzIgLSB4KSAtIFNpemUvMikgKiBwcm9ncmVzcztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyAncHgnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JztcblxuXHRcdFx0Ymcuc3R5bGUudG9wID0gLXRvcCArICdweCc7XG5cdFx0XHRiZy5zdHlsZS5sZWZ0ID0gLWxlZnQgKyAncHgnO1xuXG5cdFx0XHRpZiAocHJvZ3Jlc3MgPT09IDApIHtcblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gJyc7XG5cdFx0XHRcdHRoaXMucmVzaXplTGlzdGVuZXIuZW5kKCk7XG5cdFx0XHRcdGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG5cdFx0XHRcdGlmIChjb250YWluZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJykpIHtcblx0XHRcdFx0XHRsZXQgaWZyYW1lID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpXG5cdFx0XHRcdFx0bGV0IG5leHRFbCA9IGlmcmFtZS5uZXh0RWxlbWVudFNpYmxpbmdcblx0XHRcdFx0XHRpZnJhbWUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIWlmcmFtZS5yZW1vdmUoKSAmJiBpZnJhbWUsbmV4dEVsKVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuXHRcdH07XG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuXHR9XG5cblx0dmlkZW9TZXR0aW5ncyhOYW1lKXtcblx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzID0gW107XG5cdFx0Y29uc3QgY29udGVudCA9IHRoaXMuX19iYWxsc1tOYW1lXS5iZztcblxuXHRcdGNvbnN0IHZpZGVvID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8nKTtcblx0XHRpZiAoIXZpZGVvKSByZXR1cm47XG5cblx0XHR0aGlzLl9fYmFsbHNbTmFtZV0udmlkZW8gPSB2aWRlbztcblx0XHRjb25zdCBwcm9ncmVzcyA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignLnZpZGVvX19wcm9ncmVzcy1hY3R1YWwnKTtcblx0XHRjb25zdCBzdG9wQnV0dG9uID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW9fX3N0b3AnKTtcblxuXG5cdFx0dmlkZW8ucGxheSgpXG5cdFx0XHQudGhlbigoKT0+e1xuXG5cdFx0XHRcdGZ1bmN0aW9uIHRvZ2dsZVBsYXkoKSB7XG5cdFx0XHRcdFx0aWYgKHN0YXR1cyA9PSAncGxheWVkJykge1xuXHRcdFx0XHRcdFx0dmlkZW8ucGF1c2UoKTtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICdzdG9wcGVkJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3RvcHBlZCcpIHtcblx0XHRcdFx0XHRcdHZpZGVvLnBsYXkoKTtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICdwbGF5ZWQnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0XHRuZXcgQ2xpY2soe1xuXHRcdFx0XHRcdFx0ZWxlbWVudDogc3RvcEJ1dHRvbixcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCl7XG5cdFx0XHRcdFx0XHRcdHRvZ2dsZVBsYXkoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDbGljayh7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiB2aWRlbyxcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCl7XG5cdFx0XHRcdFx0XHRcdHRvZ2dsZVBsYXkoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cdFx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0XHRuZXcgQ3VzdG9tTGlzdGVuZXIoe1xuXHRcdFx0XHRcdFx0ZWxlbWVudDogdmlkZW8sXG5cdFx0XHRcdFx0XHRsaXN0ZW5lcjogJ3RpbWV1cGRhdGUnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2s6IHRoaXMudmlkZW9TZXRQcm9ncmVzcyh2aWRlbylcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0bGV0IHN0YXR1cyA9ICdwbGF5ZWQnO1xuXG5cdFx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0XHRuZXcgQ3VzdG9tTGlzdGVuZXIoe1xuXHRcdFx0XHRcdFx0ZWxlbWVudDogdmlkZW8sXG5cdFx0XHRcdFx0XHRsaXN0ZW5lcjogJ3BsYXknLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdFx0c3RhdHVzID0gJ3BsYXllZCc7XG5cdFx0XHRcdFx0XHRcdHN0b3BCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgndmlkZW9fX3N0b3AtLXN0b3BwZWQnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDdXN0b21MaXN0ZW5lcih7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiB2aWRlbyxcblx0XHRcdFx0XHRcdGxpc3RlbmVyOiAncGF1c2UnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdFx0c3RhdHVzID0gJ3N0b3BwZWQnO1xuXHRcdFx0XHRcdFx0XHRzdG9wQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvX19zdG9wLS1zdG9wcGVkJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KVxuXG5cdFx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0XHRuZXcgQ3VzdG9tTGlzdGVuZXIoe1xuXHRcdFx0XHRcdFx0bGlzdGVuZXI6ICdrZXl1cCcsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayhlKXtcblx0XHRcdFx0XHRcdFx0aWYgKGUud2hpY2ggIT09IDMyKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdHN0b3BCdXR0b24uY2xhc3NMaXN0LmFkZCgndmlkZW9fX3N0b3AtLXN0b3BwZWQnKTtcblx0XHRcdFx0XHRcdFx0dG9nZ2xlUGxheSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblxuXHRcdFx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzLnB1c2goXG5cdFx0XHRcdFx0bmV3IENsaWNrKHtcblx0XHRcdFx0XHRcdGVsZW1lbnQ6IGNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW9fX3Byb2dyZXNzJylbMF0sXG5cdFx0XHRcdFx0XHRjYWxsYmFjayhlKXtcblx0XHRcdFx0XHRcdFx0Y29uc3Qge3h9ID0gZTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2xpY2tQcm9ncmVzcyA9IHgvdGhpcy5vZmZzZXRXaWR0aDtcblx0XHRcdFx0XHRcdFx0dmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5kdXJhdGlvbiAqIGNsaWNrUHJvZ3Jlc3M7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRjb25zdCBtdXRlID0gbmV3IENsaWNrKHtcblx0XHRcdFx0XHRlbGVtZW50OiBjb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZGVvX19tdXRlJylbMF0sXG5cdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdGlmICghdmlkZW8ubXV0ZWQpIHtcblx0XHRcdFx0XHRcdFx0dmlkZW8ubXV0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRtdXRlLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmlkZW9fX211dGUtLW11dGVkJyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR2aWRlby5tdXRlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRtdXRlLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlkZW9fX211dGUtLW11dGVkJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKCBtdXRlICk7XG5cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCk9Pntcblx0XHRcdFx0Y29uc29sZS5sb2coJ9Cd0LUg0LfQsNC/0YPRgdGC0LjQu9C+0YHRjCcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHR2aWRlb1NldFByb2dyZXNzKHZpZGVvKXtcblx0XHRjb25zdCBjb250YWluZXIgPSB2aWRlby5wYXJlbnRFbGVtZW50O1xuXHRcdGNvbnN0IGFjdHVhbFByb2dyZXNzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb19fcHJvZ3Jlc3MtYWN0dWFsJyk7XG5cdFx0Y29uc3QgYWN0dWFsVGltZSA9IGNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlb19fYWN0dWFsVGltZScpWzBdO1xuXHRcdGNvbnN0IGFjdHVhbFRpbWVfbWludXRlcyA9IGFjdHVhbFRpbWUucXVlcnlTZWxlY3RvcignLnZpZGVvX19hY3R1YWxUaW1lLW1pbnV0ZXMnKTtcblx0XHRjb25zdCBhY3R1YWxUaW1lX3NlY29uZHMgPSBhY3R1YWxUaW1lLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb19fYWN0dWFsVGltZS1zZWNvbmRzJyk7XG5cblx0XHRjb25zdCBmdWxsVGltZSA9IGNvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlb19fZnVsbFRpbWUnKVswXTtcblx0XHRjb25zdCBmdWxsVGltZV9taW51dGVzID0gZnVsbFRpbWUucXVlcnlTZWxlY3RvcignLnZpZGVvX19mdWxsVGltZS1taW51dGVzJyk7XG5cdFx0Y29uc3QgZnVsbFRpbWVfc2Vjb25kcyA9IGZ1bGxUaW1lLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb19fZnVsbFRpbWUtc2Vjb25kcycpO1xuXG5cblx0XHRsZXQgZnVsbE1pbiA9IH5+KHZpZGVvLmR1cmF0aW9uLzYwKTtcblx0XHRsZXQgZnVsbFNlYyA9IH5+KHZpZGVvLmR1cmF0aW9uICUgNjApO1xuXHRcdGlmICggZnVsbE1pbiA8IDEwIClcblx0XHRcdGZ1bGxNaW4gPSAnMCcgKyBmdWxsTWluO1xuXG5cdFx0aWYgKCBmdWxsU2VjIDwgMTAgKVxuXHRcdFx0ZnVsbFNlYyA9ICcwJyArIGZ1bGxTZWM7XG5cblx0XHRmdWxsVGltZV9taW51dGVzLnRleHRDb250ZW50ID0gZnVsbE1pbjtcblx0XHRmdWxsVGltZV9zZWNvbmRzLnRleHRDb250ZW50ID0gZnVsbFNlYztcblxuXHRcdHJldHVybiBmdW5jdGlvbigpe1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3MgPSB2aWRlby5jdXJyZW50VGltZS92aWRlby5kdXJhdGlvbjtcblxuXHRcdFx0bGV0IGFjdHVhbE1pbiA9IH5+KHZpZGVvLmN1cnJlbnRUaW1lLzYwKTtcblx0XHRcdGxldCBhY3R1YWxTZWMgPSB+fih2aWRlby5jdXJyZW50VGltZSAlIDYwKTtcblxuXHRcdFx0aWYgKCBhY3R1YWxNaW4gPCAxMCApXG5cdFx0XHRcdGFjdHVhbE1pbiA9ICcwJyArIGFjdHVhbE1pbjtcblxuXHRcdFx0aWYgKCBhY3R1YWxTZWMgPCAxMCApXG5cdFx0XHRcdGFjdHVhbFNlYyA9ICcwJyArIGFjdHVhbFNlYztcblxuXHRcdFx0YWN0dWFsVGltZV9taW51dGVzLnRleHRDb250ZW50ID0gYWN0dWFsTWluO1xuXHRcdFx0YWN0dWFsVGltZV9zZWNvbmRzLnRleHRDb250ZW50ID0gYWN0dWFsU2VjO1xuXG5cdFx0XHRhY3R1YWxQcm9ncmVzcy5zdHlsZS50cmFuc2l0aW9uID0gJ3dpZHRoIC4ycyBsaW5lYXInO1xuXHRcdFx0YWN0dWFsUHJvZ3Jlc3Muc3R5bGUud2lkdGggPSBwcm9ncmVzcyAqIDEwMCArICclJztcblx0XHR9XG5cdH1cblxuXG59XG4iLCIvLyB2ZXJzaW9uIDAuMC4wXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGljayB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHR0aGlzLmVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQgfHwgd2luZG93O1xuXHRcdHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQgfHwgbnVsbDtcblxuXHRcdHRoaXMuTGlzdGVuZXIoKTtcblx0fVxuXG5cdExpc3RlbmVyKCkge1xuXHRcdHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5jYWxsYmFjayk7XG5cdH1cblxuXHRlbmQoKSB7XG5cdFx0dGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmNhbGxiYWNrKTtcblx0fVxufVxuIiwiLy8gdmVyc2lvbiAwLjAuMFxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0dGhpcy5lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50IHx8IHdpbmRvdztcblx0XHR0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblx0XHR0aGlzLmxpc3RlbmVyID0gb3B0aW9ucy5saXN0ZW5lcjtcblx0XHR0aGlzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50IHx8IG51bGw7XG5cblx0XHR0aGlzLkxpc3RlbmVyKCk7XG5cdH1cblxuXHRMaXN0ZW5lcigpIHtcblx0XHR0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmxpc3RlbmVyLHRoaXMuY2FsbGJhY2spO1xuXHR9XG5cblx0ZW5kKCkge1xuXHRcdHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMubGlzdGVuZXIsdGhpcy5jYWxsYmFjayk7XG5cdH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZURyYXcge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcblx0XHR0aGlzLmlkID0gRGF0ZS5ub3coKSAqIE1hdGgucmFuZG9tKCk7XG5cblx0XHR0aGlzLl9fZGF0YSA9IHt9O1xuXHRcdGlmIChvcHRpb25zLmRhdGEpIHtcblx0XHRcdHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcblx0XHRcdC8vINC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDQu9C4INC60Y3RiCDQsiBqc1xuXHRcdFx0dGhpcy5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgfHwgMTtcblx0XHR9XG5cdFx0aWYgKG9wdGlvbnMubG9jYWxEYXRhKXtcblx0XHRcdHRoaXMubG9jYWxEYXRhID0gb3B0aW9ucy5sb2NhbERhdGE7XG5cdFx0fVxuXHRcdC8vINC/0L7Qt9C40YbQuNGPLCDQutGD0LTQsCDQstGB0LUg0Y3RgtC+INCy0YHRgtCw0LLQu9GP0LXRgtGB0Y9cblx0XHR0aGlzLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCBudWxsO1xuXHRcdC8vINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LPQviDRjdC70LXQvNC10L3RgtCwLCDQsiDQutC+0YLQvtGA0L7QvCDQsdGD0LTQtdGCINC60L7QvdGC0LXQvdGCXG5cdFx0dGhpcy5fX2VsZW1lbnQgPSAob3B0aW9ucy5lbGVtZW50IHx8ICdkaXYnKTtcblx0XHR0aGlzLl9fY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcblxuXHRcdC8vINC70L7Qs9C40YDQvtCy0LDQvdC40LUg0LTQtdC50YHRgtCy0LjQuSDRgdC60YDQuNC/0YLQsFxuXHRcdHRoaXMuX19pbmRpY2F0aW9uID0gb3B0aW9ucy5pbmRpY2F0aW9uIHx8IG51bGw7XG5cblx0XHQvLyDQutC+0L3RgtC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0LzQvtC20L3QviDRg9C60LDQt9Cw0YLRjCDQv9GA0Lgg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40LguXG5cdFx0dGhpcy5fX2NvbnQgPSBvcHRpb25zLmNvbnRlbnQgfHwgbnVsbDtcblxuXG5cdFx0Ly8g0YTRg9C90LrRhtC40Y8g0LfQsNC/0YPRgdC60LDQtdGC0YHRjyDQv9C+0YHQu9C1INC+0YLRgNC40YHQvtCy0LrQuCDQuCDQsiDQvdC10Lkg0LTQvtC70LbQtdC9INCx0YvRgtGMINC60L7QtCwg0LrQsNC6INC/0L7QutCw0LfQsNGC0Ywg0LrQvtC90YLQtdC90YIuXG5cdFx0Ly8g0LDQvdC40LzQsNGG0LjRjyDQv9C+0Y/QstC70LXQvdC40Y9cblx0XHR0aGlzLnNob3cgPSBvcHRpb25zLnNob3cgfHwgbnVsbDtcblx0XHR0aGlzLmhpZGUgPSBvcHRpb25zLmhpZGUgfHwgbnVsbDtcblxuXHRcdC8vINGE0YPQvdC60YbQuNGPINC/0L7RgdC70LUg0LDQvdC40LzQsNGG0LjQuCDQv9C+0Y/QstC70LXQvdC40Y9cblx0XHR0aGlzLl9fY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IG51bGw7XG5cblx0XHRpZiAob3B0aW9ucy5jb250YWluZXIpIHtcblx0XHRcdHRoaXMuX19wcmVyZW5kZXIgPSB0cnVlO1xuXHRcdFx0dGhpcy5fX2RyYXdlZCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vINGN0LvQtdC80LXQvdGCLCDQsiDQutC+0YLQvtGA0YvQuSDQt9Cw0LPRgNGD0LfQuNGC0YHRjyDQutC+0L3RgtC10L3Rgi5cblx0XHR0aGlzLmJsb2NrID0gb3B0aW9ucy5jb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fZWxlbWVudCk7XG5cblxuXHRcdGlmICh0aGlzLl9fY2xhc3NOYW1lKSB7XG5cdFx0XHR0aGlzLmJsb2NrLmNsYXNzTmFtZSA9IHRoaXMuX19jbGFzc05hbWU7XG5cdFx0fVxuXHRcdGlmIChvcHRpb25zLmlkKSB7XG5cdFx0XHR0aGlzLmJsb2NrLmlkID0gb3B0aW9ucy5pZDtcblx0XHR9XG5cdFx0Ly8g0LzQsNGB0YHQuNCyINC00LXRgtC10LksINC00LvRjyDRg9GB0YLQsNC90L7QstC60Lgg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5XG5cdFx0dGhpcy5jaGlsZHJlbkFycmF5ID0gW107XG5cdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXHRcdHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcyA9IFtdO1xuXHR9XG5cblx0c2V0IGNvbnRlbnQoY29kZSkge1xuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JjQt9C80LXQvdC10L0g0LrQvtC90YLQtdC90YIsINC80L7QttC90L4g0L/QtdGA0LXRgNC40YHQvtCy0LDRgtGMLicpO1xuXG5cdFx0XHRpZiAoIGNvZGUgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JrQvtC90YLQtdC90YIgLSDRhNGD0L3QutGG0LjRjycpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JrQvtC90YLQtdC90YIgLSDRgdGC0YDQvtC60LAnKTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX19jb250ID0gY29kZTtcblx0XHR0aGlzLl9fZHJhd2VkID0gZmFsc2U7XG5cdH1cblxuXHRnZXQgY29udGVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fX2NvbnQ7XG5cdH1cblxuXHRzZXQgY2hpbGQob2JqZWN0KSB7XG5cblx0XHRpZiAodGhpcy5pc0NoaWxkcmVuKG9iamVjdCkpIHJldHVybiBudWxsO1xuXG5cdFx0dGhpcy5jaGlsZHJlbkFycmF5LnB1c2gob2JqZWN0KTtcblx0XHRvYmplY3QuZmF0aGVyID0gdGhpcztcblx0fVxuXG5cdGdldCBjaGlsZHJlbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGlsZHJlbkFycmF5O1xuXHR9XG5cblxuXHRpc0NoaWxkcmVuKG9iamVjdCkge1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5BcnJheVtpXTtcblx0XHRcdGlmIChjaGlsZCA9PSAgb2JqZWN0KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzZXQgcmVtb3ZlQ2hpbGQob2JqZWN0KSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5BcnJheVtpXTtcblx0XHRcdGlmIChjaGlsZCA9PT0gb2JqZWN0KSB7XG5cblx0XHRcdFx0Y2hpbGQgPSBudWxsO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldCByZW1vdmVDaGlsZHJlbigpIHtcblx0XHR0aGlzLmNoaWxkcmVuQXJyYXkgPSBbXTtcblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQlNC10YLQuCjQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4KSDRg9C00LDQu9C10L3RiycpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jaGlsZHJlbkFycmF5O1xuXHR9XG5cblxuXHRzZXQgcG9zaXRpb24oY29kZSkge1xuXHRcdGlmICghY29kZSkgcmV0dXJuO1xuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JjQt9C80LXQvdC10L3QsC/QtNC+0LHQsNCy0LvQtdC90LAg0L/QvtC30LjRhtC40Y8sINC90YPQttC90L4g0L7RgtGA0LjRgdC+0LLQsNGC0YwnKTtcblx0XHR9XG5cdFx0dGhpcy5fX2RyYXdlZCA9IGZhbHNlO1xuXHRcdC8vIHRoaXMuY2hhbmdlUG9zaXRpb24gPSB0cnVlOyAqKiAxXG5cblx0XHRpZiAoY29kZSBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHR0aGlzLl9fcG9zID0gY29kZTtcblx0XHRcdHJldHVyblxuXHRcdH0gZWxzZSBpZiAoY29kZSBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHRcdFx0dGhpcy5fX3BvcyA9IFtjb2RlXTtcblx0XHRcdHJldHVyblxuXHRcdH0gLy8gJ2FmdGVyZW5kIC5oZWFkZXInIHx8IFsnYWZ0ZXJlbmQnLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXInKV1cblx0XHRlbHNlIGlmICh0eXBlb2YgY29kZSA9PSAnc3RyaW5nJyApIHtcblx0XHRcdHZhciBhcnIgPSBjb2RlLnNwbGl0KCcgJyk7XG5cdFx0XHR0aGlzLl9fcG9zID0gW3tcblx0XHRcdFx0cGxhY2U6IGFyclswXSxcblx0XHRcdFx0ZWxlbWVudDogYXJyWzFdLFxuXHRcdFx0XHRmYXRoZXI6IGFyclsyXVxuXHRcdFx0fV07XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGlmICghKGNvZGUgaW5zdGFuY2VvZiBPYmplY3QpKVxuXHRcdFx0Y29uc29sZS5lcnJvcih0aGlzLmlkLGDQn9C+0LfQuNGG0LjRjyAtINGN0YLQviDRgdGC0YDQvtC60LAsINC+0LHRitC10LrRgih7cGxhY2U6J2JlZm9yZWVuZCcsZWxlbWVudDonLmFwcCdbLGZhdGhlcjogKHRoaXMuZmF0aGVyLmNsYXNzKV19KSDQuNC70Lgg0LzQsNGB0YHQuNCyINC40Lcg0L7QsdGK0LXQutGC0L7QsmApO1xuXHRcdH1cblx0fVxuXG5cdGdldCBwb3NpdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fX3Bvcztcblx0fVxuXG5cdGdldCBkcmF3KCkge1xuXG5cdFx0aWYgKHRoaXMuX19kcmF3U3RhcnQpIHtcblxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Cj0LbQtSDQuNC00LXRgiDQvtGC0YDQuNGB0L7QstC60LAsINCy0YLQvtGA0LDRjyDQv9Cw0YDQsNC70LvQtdC70YzQvdC+INC+0YLQutC70L7QvdC10L3QsC4nKVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fX2RyYXdlZCAmJiB0aGlzLmNoYW5nZWRDaGlsZHJlbnMpIHtcblx0XHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbkFycmF5W2ldO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXdlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fX2RyYXdlZCAmJiAhdGhpcy5fX2NoYW5nZWRDYWNoZSkge1xuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0J3QtSDQvtGC0YDQuNGB0L7QstCw0L3Qviwg0LjQt9C80LXQvdC10L3QuNC5INC90LUg0LfQsNC80LXRh9C10L3Qvi4nKVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIGRyYXdTdGFydCAtPiDQn9C+0YjQu9CwINC+0YLRgNC40YHQvtCy0LrQsFxuXHRcdHRoaXMuX19kcmF3U3RhcnQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX19kcmF3TG9naWMoKS50aGVuKCgpPT57XG5cblx0XHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbkFycmF5W2ldO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX19jYWxsYmFjaykgdGhpcy5fX2NhbGxiYWNrKCk7XG5cblx0XHR9KVxuXHRcdC5jYXRjaCgoZSk9Pntcblx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQn9C+INC60LDQutC+0Lkt0YLQviDQv9GA0LjRh9C40L3QtSwg0L7RgtGA0LjRgdC+0LLQutCwINC30LDQstC10YDRiNC10L3QsC4nLGUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0X19kcmF3TG9naWMoKSB7XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGlmICghdGhpcy5fX2NvbnQpIHtcblx0XHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ9Cd0LXRgtGDINC60L7QvdGC0LXQvdGC0LAg0LTQu9GPINC+0YLRgNC40YHQvtCy0LrQuC4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX19jb250IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fX2RyYXdGb3JGdW5jdGlvbigpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX19jb250ID09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fX2RyYXdGb3JTdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0bGV0IGVycm9yID0gbmV3IEVycm9yKCfQmtC+0L3QtdGC0LXQvdGCINC90LUg0YTRg9C90LrRhtC40Y8g0Lgg0L3QtSDRgdGC0YDQvtC60LAsINCwINC80LDRgdGB0LjQsiDQuCDQvtCx0YrQtdC60YIg0L3QtSDQtNC+0L/Rg9GB0YLQuNC80YsuJyk7XG5cdFx0XHRjb25zb2xlLmVycm9yKHRoaXMuaWQsZXJyb3IpO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0X19kcmF3Rm9yRnVuY3Rpb24oKSB7XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CX0LDRiNC70L4g0LIg0L7RgtGA0LjRgdC+0LLQutGDINGE0YPQvdC60YbQuNC4Jyk7XG5cdFx0fVxuXHRcdGxldCBkYXRhO1xuXHRcdGlmICh0aGlzLnVybCkge1xuXHRcdFx0ZGF0YSA9IHRoaXMuY2FjaGVDb250cm9sKHRoaXMudXJsKVxuXHRcdH0gZWxzZSBpZiAodGhpcy5sb2NhbERhdGEpIHtcblx0XHRcdGRhdGEgPSBQcm9taXNlLnJlc29sdmUodGhpcy5sb2NhbERhdGEpO1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CS0LfRj9C70L4g0LvQvtC60LDQu9GM0L3Ri9C1INC00LDQvdC90YvQtScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhXG5cdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ce0YLRgNC40YHQvtCy0LrQsCDQuNC3INC00LDQvdC90YvRhScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKHRoaXMuaWQsJ9Cf0YDQvtC80LjRgSDQvdC1INC+0YLQtNCw0Lsg0YDQtdC30YPQu9GM0YLQsNGCINC40LvQuCDQvtGC0LLQtdGCINGB0LXRgNCy0LXRgNCwINC/0YPRgdGC0L7QuS4nKTtcblx0XHRcdFx0XHRyZXN1bHQgPSAnJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRpZiAoIXRoaXMuX19jb250KHJlc3VsdCkpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4odGhpcy5pZCwn0KTRg9C90LrRhtC40Y8g0LrQvtC90YLQtdC90YLQsCDQvdC40YfQtdCz0L4g0L3QtSDQstC+0LfQstGA0LDRidCw0LXRgicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhpZGUgJiYgdGhpcy5fX2RyYXdlZCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5oaWRlKClcblx0XHRcdFx0XHQudGhlbigoKT0+e1xuXHRcdFx0XHRcdFx0dGhpcy5ibG9jay5pbm5lckhUTUwgPSB0aGlzLl9fY29udChyZXN1bHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmluc2VydENvbnQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYmxvY2suaW5uZXJIVE1MID0gdGhpcy5fX2NvbnQocmVzdWx0KTtcblx0XHRcdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmICghdGhpcy5ibG9jay5vZmZzZXRXaWR0aCkge1xuXHRcdFx0XHRcdHRoaXMuaW5zZXJ0Q29udCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh0aGlzLnNob3cpIHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCk9Pntcblx0XHRcdFx0XHRcdFx0dGhpcy5zaG93KClcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CQ0L3QuNC80LjRgNC+0LLQsNC90L4nLHRoaXMuYmxvY2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0pXG5cdFx0LmNhdGNoKChlcnIpPT57XG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS53YXJuKHRoaXMuaWQsJ9Ce0YjQuNCx0LrQsCDQsiDQv9GA0L7QvNC40YHQtSDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQsNC90L3Ri9GFLCDQstC+0LfQvNC+0LbQvdC+IDQwNCcpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSk7XG5cdH1cblxuXHRfX2RyYXdGb3JTdHJpbmcoKXtcblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CX0LDRiNC70L4g0LIg0L7RgtGA0LjRgdC+0LLQutGDINGB0YLRgNC+0LrQuCcpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9fY2hhbmdlZENhY2hlICYmIHRoaXMuX19kcmF3ZWQpe1xuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCxcItCe0YHRgtCw0L3QvtCy0LvQtdC90L4sINGB0LzQtdC90LAg0LrRjdGI0LAg0L3QtSDQuNC30LzQtdC90LjRgiDRgdGC0YDQvtC60YMuXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRpZiAoIXRoaXMuX19jb250KSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybih0aGlzLmlkLCfQodGC0YDQvtC60LAg0LrQvtC90YLQtdC90YLQsCDQv9GD0YHRgtCwJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0aGlzLmhpZGUgJiYgdGhpcy5fX2RyYXdlZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGlkZSgpXG5cdFx0XHRcdC50aGVuKCgpPT57XG5cdFx0XHRcdFx0dGhpcy5ibG9jay5pbm5lckhUTUwgPSB0aGlzLl9fY29udDtcblx0XHRcdFx0XHR0aGlzLmluc2VydENvbnQoKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYmxvY2suaW5uZXJIVE1MID0gdGhpcy5fX2NvbnQ7XG5cdFx0XHRpZiAoIXRoaXMuYmxvY2sub2Zmc2V0V2lkdGgpIHtcblx0XHRcdFx0dGhpcy5pbnNlcnRDb250KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5zaG93KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKT0+e1xuXHRcdFx0XHRcdFx0dGhpcy5zaG93KClcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CQ0L3QuNC80LjRgNC+0LLQsNC90L4nLHRoaXMuYmxvY2spO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydENvbnQoKSB7XG5cdFx0bGV0IGFycmF5ID0gdGhpcy5wb3NpdGlvbjtcblx0XHRpZiAodGhpcy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0aWYgKCFhcnJheSkgY29uc29sZS5sb2coJ9Cd0LXRgiDQv9C+0LfQuNGG0LjQuCcpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdHZhciB7cGxhY2UsIGVsZW1lbnQsIGZhdGhlcn0gPSBhcnJheVtpbmRleF07XG5cblx0XHRcdGlmIChmYXRoZXIgJiYgZmF0aGVyICE9IHRoaXMuZmF0aGVyLl9fY2xhc3NOYW1lKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIHNlYXJjaEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuXHRcdFx0aWYgKHNlYXJjaEVsZW1lbnQpIHtcblx0XHRcdFx0c2VhcmNoRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQocGxhY2UgLHRoaXMuYmxvY2spO1xuXHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX19kcmF3ZWQgJiYgIXNlYXJjaEVsZW1lbnQgJiYgKHRoaXMuX19pbmRpY2F0aW9uIHx8IHdpbmRvdy5kZXZlbG9wbWVudCkgKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnJWMg0J3QtSDQvtGC0YDQuNGB0L7QstCw0L3Qviwg0L3QtSDQvdCw0LnQtNC10L0g0Y3Qu9C10LzQtdC90YInLCAnYmFja2dyb3VuZDogI2ZmMDAzNzsgY29sb3I6ICNmZmYnKTtcblx0XHR9XG5cblxuXHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuQXJyYXlbaV07XG5cdFx0XHRcdGNoaWxkLmRyYXdlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fX2RyYXdlZCAmJiBzZWFyY2hFbGVtZW50ICYmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ce0YLRgNC40YHQvtCy0LDQvdC+Jyx0aGlzLmJsb2NrKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaG93KSB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpPT57XG5cdFx0XHRcdHRoaXMuc2hvdygpXG5cdFx0XHR9KTtcblx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQkNC90LjQvNC40YDQvtCy0LDQvdC+Jyx0aGlzLmJsb2NrKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9kcmF3U3RhcnQgLT4g0LrQvtC90LXRhiDQvtGC0YDQuNGB0L7QstC60Lhcblx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cblx0fVxuXG5cdGdldCBkZWxldGUoKSB7XG5cdFx0aWYgKHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGgpIHtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHR0aGlzLmNoaWxkcmVuW2ldLmRlbGV0ZTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhpZGUpIHtcblx0XHRcdGxldCBhID0gdGhpcy5oaWRlKCkudGhlbigoKT0+e1xuXG5cdFx0XHRcdGlmICh0aGlzLmNoaWxkcmVuSGlkZU1vZHVsZXMgJiYgdGhpcy5jaGlsZHJlbkhpZGVNb2R1bGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFByb21pc2UuYWxsKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcykudGhlbih2YWx1ZSA9PiB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX19kcmF3ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdHRoaXMuYmxvY2sucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ct0LvQtdC80LXQvdGCINGD0LTQsNC70LXQvScpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0scmVhc29uID0+IHtcblx0XHRcdFx0XHRcdGNvbnNvbGUud2Fybign0J/RgNC+0LHQu9C10LzRiyDQstGL0L/QvtC70L3QtdC90LjRjyDQv9GA0L7RgdC40LzQsCDQsNC90LjQvNCw0YbQuNC4Jyx0aGlzLmlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX19kcmF3ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmJsb2NrLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0K3Qu9C10LzQtdC90YIg0YPQtNCw0LvQtdC9Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5jaGlsZHJlbkhpZGVNb2R1bGVzID0gW107XG5cdFx0XHRcdC8vIGVuZCB0aGVuXG5cdFx0XHR9KTtcblxuXHQgICAgLy8g0L/QvtGB0LzQvtGC0YDQtdGC0Ywg0LPQtNC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQuCDRg9Cx0YDQsNGC0Ywg0LXRgdGC0Ywg0L3QtSDQvdGD0LbQvdC+XG5cdFx0XHQvLyB3aW5kb3cuaGlkZU1vZHVsZXMucHVzaChhKTtcblx0XHRcdGlmICh0aGlzLmZhdGhlcikge1xuXHRcdFx0XHR0aGlzLmZhdGhlci5jaGlsZHJlbkhpZGVNb2R1bGVzLnB1c2goYSk7XG5cblx0XHRcdFx0aWYgKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcyAmJiB0aGlzLmNoaWxkcmVuSGlkZU1vZHVsZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5mYXRoZXIuY2hpbGRyZW5IaWRlTW9kdWxlcy5wdXNoKFByb21pc2UuYWxsKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fX2RyYXdlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5ibG9jay5yZW1vdmUoKTtcblxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQrdC70LXQvNC10L3RgiDRg9C00LDQu9C10L0nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0fVxuXG5cdHNldCBkYXRhKHVybCkge1xuXHRcdGlmICh0aGlzLnVybCA9PSB1cmwpIHtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9fY2hhbmdlZENhY2hlID0gdHJ1ZTtcblx0XHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdFx0dGhpcy5jYWNoZUNvbnRyb2wodGhpcy51cmwpXG5cdFx0fVxuXHR9XG5cblx0Z2V0IGRhdGEoKSB7XG5cdFx0aWYgKHRoaXMudXJsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2wodGhpcy51cmwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXJyb3IgPSAgbmV3IEVycm9yKCfQl9Cw0L/RgNC+0YjQtdC90Ysg0LTQsNC90L3Ri9C1LCDQutC+0YLQvtGA0YvRhSDQvdC10YIuJyk7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IodGhpcy5pZCwn0JIgdGhpcy51cmwg0L3QtdGCINC00LDQvdC90YvRhSDQviDRgdGB0YvQu9C60LUsINC/0L4g0LrQvtGC0L7RgNC+0Lkg0LTQvtC70LbQvdGLINCx0YvQu9C4INC30LDQs9GA0YPQt9C40YLRjNGB0Y8g0LTQsNC90L3Ri9C1LicsZXJyb3Iuc3RhY2spO1xuXG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRzZXQgbG9jYWxEYXRhKGRhdGEpIHtcblx0XHQvLyBkZWJ1Z2dlclxuXHRcdGlmICh0aGlzLl9fbG9jYWxEYXRhICE9PSBkYXRhKSB7XG5cdFx0XHR0aGlzLl9fbG9jYWxEYXRhID0gZGF0YTtcblx0XHRcdHRoaXMuX19jaGFuZ2VkQ2FjaGUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBsb2NhbERhdGEoKSB7XG5cdFx0aWYgKHRoaXMuX19sb2NhbERhdGEpIHtcblx0XHRcdHJldHVybiB0aGlzLl9fbG9jYWxEYXRhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXJyb3IgPSAgbmV3IEVycm9yKCfQl9Cw0L/RgNC+0YjQtdC90Ysg0LTQsNC90L3Ri9C1LCDQutC+0YLQvtGA0YvRhSDQvdC10YIuJyk7XG5cdFx0XHRjb25zb2xlLmVycm9yKHRoaXMuaWQsJ9Cd0LXRgtGDINC70L7QutCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUnLGVycm9yLnN0YWNrKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdGNhY2hlQ29udHJvbCh1cmwsb3B0aW9ucyxwcmVsb2FkKSB7XG5cdFx0Ly/Qt9Cw0YnQuNGC0LAg0L7RgiDQtNCy0L7QudC90L7Qs9C+INC60LvQuNC60LBcblx0XHQvLyBwcmVsb2FkID09IHRydWUg0LTQsNC10YIg0L/QvtC00LPRgNGD0LfQuNGC0Ywg0LTQsNC90L3Ri9C1INC90LXQt9Cw0LLQuNGB0LjQvNC+INC+0YIg0LfQsNCz0YDRg9C30LrQuCDQvtGB0L3QvtCy0L3Ri9GFINC00LDQvdC90YvRhS5cblx0XHRpZiAodGhpcy5sb2FkaW5nICYmICFwcmVsb2FkKSByZXR1cm4gdGhpc1t1cmxdO1xuXHRcdC8vXG5cdFx0aWYgKCF0aGlzLmNhY2hlKSB7XG5cdFx0XHR0aGlzLmxvYWREYXRhKHVybCwgb3B0aW9ucyk7XG5cdFx0XHRyZXR1cm4gdGhpc1t1cmxdO1xuXHRcdH1cblxuXHRcdGlmICghdGhpc1t1cmxdIHx8ICF0aGlzLl9fZGF0YVt1cmxdKXtcblx0XHRcdHRoaXMubG9hZERhdGEodXJsLCBvcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CS0LfRj9GC0L4g0LjQtyDQutGN0YjQsCcsdXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLl9fZGF0YVt1cmxdICYmIFByb21pc2UucmVzb2x2ZSh0aGlzLl9fZGF0YVt1cmxdKSkgfHwgdGhpc1t1cmxdO1xuXHR9XG5cblx0bG9hZERhdGEodXJsLCBvcHRpb25zID0ge30pIHtcblxuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pIHtcblx0XHRcdGlmICghdXJsKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ9Cd0LXRgtGDINGB0YHRi9C70LrQuCDQvdCwINC00LDQvdC90YvQtScpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcmVxdWVzdCgpIHtcblx0XHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cblx0XHRcdGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHRcdGxldCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJztcblxuXHRcdFx0eGhyLm9wZW4obWV0aG9kLHVybCwgdHJ1ZSk7XG5cblx0XHRcdGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoICggcmVzb2x2ZSwgcmVqZWN0ICkgPT4ge1xuXHRcdFx0XHR4aHIub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRcdGlmICh4aHIuc3RhdHVzICE9PSAyMDApIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLHRoaXNbdXJsXSwgdXJsLCfRgdC60LDRh9Cw0L3QvicpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgZGF0YTtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRkYXRhID0geGhyLnJlc3BvbnNlVGV4dDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVzb2x2ZShkYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fX2RhdGFbdXJsXSA9IGRhdGE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0eGhyLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBlcnJvciA9IG5ldyBFcnJvcih4aHIuc3RhdHVzICsgJzogJyArIHhoci5zdGF0dXNUZXh0KTtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IodGhpcy5pZCwnQWpheCBlcnJvcicsIGVycm9yLCB1cmwpO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzW3VybF07XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL9Cy0YHQtdCz0LTQsCDQsdC10Lcg0LrRjdGI0LAsINC10LPQviDQtNC10LvQsNC10YIg0L/RgNC40LvQvtC20LXQvdC40LVcblx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUnKTtcblxuXHRcdFx0XHRtZXRob2QgPT0gJ1BPU1QnID8geGhyLnNlbmQob3B0aW9ucy5ib2R5KTogeGhyLnNlbmQoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzW3VybF0gPSBwcm9taXNlO1xuXHRcdFx0cmV0dXJuIHByb21pc2U7XG5cdFx0fVxuXHRcdGxldCBwcm9taXNlID0gcmVxdWVzdC5jYWxsKHRoaXMpO1xuXG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcmVxdWVzdC5jYWxsKHRoaXMpO1xuXHRcdFx0XHR9KTtcblx0fVxufVxuXG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXIge1xuXHRjb25zdHJ1Y3RvcihzdHJ1Y3R1cmUsIG9wdGlvbnMgPSB7fSkge1xuXHRcdHRoaXMuX19pbmRpY2F0aW9uID0gb3B0aW9ucy5pbmRpY2F0aW9uIHx8IG51bGw7XG5cblx0XHRpZiAoc3RydWN0dXJlKSB7XG5cdFx0XHR0aGlzLnJvdXRlKHN0cnVjdHVyZSlcblx0XHR9XG5cdH1cblxuXG5cdHN0cnVjdHVyZShvYmplY3QpIHtcblx0XHRmdW5jdGlvbiBfX3BhcnNlKGVsZW1lbnQsY2hpbGRyZW4pIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQ2hpbGRyZW47XG5cblx0XHRcdGVsZW1lbnQuY2hhbmdlZENoaWxkcmVucyA9IHRydWU7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG5cdFx0XHRcdGlmIChjaGlsZC5lbGVtZW50KSB7XG5cdFx0XHRcdFx0X19wYXJzZShjaGlsZC5lbGVtZW50LGNoaWxkLnN1YmplY3RzKTtcblx0XHRcdFx0XHRlbGVtZW50LmNoaWxkID0gY2hpbGQuZWxlbWVudDtcblx0XHRcdFx0XHRjaGlsZC5lbGVtZW50LmZhdGhlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5jaGlsZCA9IGNoaWxkO1xuXHRcdFx0XHRcdGNoaWxkLmZhdGhlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuYWN0aXZlU3RydWN0dXJlKSB7XG5cdFx0XHQvLyB0aGlzLmFjdGl2ZVN0cnVjdHVyZS5lbGVtZW50LmRlbGV0ZTtcblxuXHRcdFx0aWYgKHRoaXMuYWN0aXZlU3RydWN0dXJlID09IG9iamVjdCkgcmV0dXJuO1xuXG5cdFx0XHRsZXQgYWN0aXZlRWxlbWVudHMgPSBbXTtcblx0XHRcdGxldCBuZXdFbGVtZW50cyA9IFtdO1xuXG5cdFx0XHRfX3BhcnNlRm9yRGVsZXRlKHRoaXMuYWN0aXZlU3RydWN0dXJlLGFjdGl2ZUVsZW1lbnRzKTtcblx0XHRcdF9fcGFyc2VGb3JEZWxldGUob2JqZWN0LG5ld0VsZW1lbnRzKTtcblxuXHRcdFx0Ly8gYWN0aXZlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihhY3RpdmVJdGVtKXtcblx0XHRcdC8vIFx0bmV3RWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihuZXdJdGVtLG5ld0l0ZW1JbmRleCl7XG5cdFx0XHQvLyBcdFx0aWYgKGFjdGl2ZUl0ZW0gIT0gbmV3SXRlbSAmJiBuZXdJdGVtSW5kZXggPT0gbmV3SXRlbXNDb3VudCkge1xuXHRcdFx0Ly8gXHRcdFx0YWN0aXZlSXRlbS5kZWxldGU7XG5cdFx0XHQvLyBcdFx0fVxuXHRcdFx0Ly8gXHR9KTtcblx0XHRcdC8vIH0pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IGFjdGl2ZUVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdGFjdGl2ZUVsZW1lbnRzW2ldLnJlbW92ZUNoaWxkcmVuO1xuXHRcdFx0XHRmb3IgKHZhciBxID0gbmV3RWxlbWVudHMubGVuZ3RoIC0gMTsgcSA+PSAwOyBxLS0pIHtcblxuXHRcdFx0XHRcdGlmIChhY3RpdmVFbGVtZW50c1tpXSA9PSBuZXdFbGVtZW50c1txXSkgYnJlYWs7XG5cblx0XHRcdFx0XHRpZiAocSA9PSAwKSB7XG5cdFx0XHRcdFx0XHRhY3RpdmVFbGVtZW50c1tpXS5kZWxldGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblxuXHRcdH1cblx0XHR0aGlzLmFjdGl2ZVN0cnVjdHVyZSA9IG9iamVjdDtcblx0XHRfX3BhcnNlKG9iamVjdC5lbGVtZW50LG9iamVjdC5zdWJqZWN0cyk7XG5cblx0XHQvLyBhc2RzZC5zdHJ1Y3R1cmUoe1xuXHRcdC8vIFx0ZWxlbWVudDogbmF2LFxuXHRcdC8vIFx0Y2hpbGRyZW46IFtcblx0XHQvLyBcdFx0cGFnZTEsXG5cdFx0Ly8gXHRcdHtcblx0XHQvLyBcdFx0XHRlbGVtZW50OnBhZ2UyLFxuXHRcdC8vIFx0XHRcdGNoaWxkcmVuOiBbXG5cdFx0Ly8gXHRcdFx0XHRuYXZCdXR0b24sXG5cdFx0Ly8gXHRcdFx0XHRjbG9zZUJ1dHRvblxuXHRcdC8vIFx0XHRcdF1cblx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XVxuXHRcdC8vIH0pO1xuXG5cdFx0ZnVuY3Rpb24gX19wYXJzZUZvckRlbGV0ZShvYmplY3QsYXJyYXkpe1xuXHRcdFx0YXJyYXkucHVzaChvYmplY3QuZWxlbWVudCk7XG5cdFx0XHRvYmplY3Quc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbihpdGVtLGluZGV4KXtcblx0XHRcdFx0aWYgKGl0ZW0uc3ViamVjdHMpIHtcblx0XHRcdFx0XHRfX3BhcnNlRm9yRGVsZXRlKGl0ZW0sYXJyYXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFycmF5LnB1c2goaXRlbSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cm91dGUocGFnZXMpe1xuXHRcdGxldCBocmVmID0gbG9jYXRpb24ucGF0aG5hbWU7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHBhZ2VzW2ldLmxpbmsgPT0gaHJlZikge1xuXHRcdFx0XHR0aGlzLnN0cnVjdHVyZShwYWdlc1tpXS5zdHJ1Y3R1cmUpO1xuXHRcdFx0XHRwYWdlc1tpXS5zdHJ1Y3R1cmUuZWxlbWVudC5kcmF3O1xuXHRcdFx0XHRzY3JvbGxUbygwLDApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdGNvbnNvbGUud2Fybign0J/QvtC00YXQvtC00Y/RidCw0Y8g0YHRgdGL0LvQutCwINC90LUg0L3QsNC50LTQtdC90LAnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFnZXMg0Y3RgtC+INC80LDRgdGB0LjQsiDQuNC3INGB0YLRgNGD0LrRgtGD0YAo0L7QsdGK0LXQutGC0L7Qsilcblx0XHRhZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IChldmVudC50YXJnZXQudGFnTmFtZSA9PSAnQScgJiYgZXZlbnQudGFyZ2V0KSB8fCBldmVudC50YXJnZXQuY2xvc2VzdCgnYScpO1xuXHRcdFx0aWYgKGVsKSB7XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGxldCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cdFx0XHRcdFx0aWYgKHBhZ2VzW2ldLmxpbmsgPT0gaHJlZikge1xuXHRcdFx0XHRcdFx0dGhpcy5zdHJ1Y3R1cmUocGFnZXNbaV0uc3RydWN0dXJlKTtcblx0XHRcdFx0XHRcdHBhZ2VzW2ldLnN0cnVjdHVyZS5lbGVtZW50LmRyYXc7XG5cdFx0XHRcdFx0XHRzY3JvbGxUbygwLDApO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdGhpc3RvcnkucHVzaFN0YXRlKHtocmVmfSwnJyxocmVmKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ9Cf0L7QtNGF0L7QtNGP0YnQsNGPINGB0YHRi9C70LrQsCDQvdC1INC90LDQudC00LXQvdCwJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0pO1xuXG5cdFx0YWRkRXZlbnRMaXN0ZW5lciggJ3BvcHN0YXRlJywgZXZlbnQgPT4ge1xuXG5cdFx0XHRjb25zdCBocmVmID0gZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHJlZiB8fCBsb2NhdGlvbi5wYXRobmFtZTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocGFnZXNbaV0ubGluayA9PSBocmVmKSB7XG5cdFx0XHRcdFx0dGhpcy5zdHJ1Y3R1cmUocGFnZXNbaV0uc3RydWN0dXJlKTtcblx0XHRcdFx0XHRwYWdlc1tpXS5zdHJ1Y3R1cmUuZWxlbWVudC5kcmF3O1xuXHRcdFx0XHRcdHNjcm9sbFRvKDAsMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCfQn9C+0LTRhdC+0LTRj9GJ0LDRjyDRgdGB0YvQu9C60LAg0L3QtSDQvdCw0LnQtNC10L3QsCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRzZXRQYWdlKCl7XG5cblx0fVxufVxuIiwiaW1wb3J0IFBhZ2VEcmF3IGZyb20gJ2RyYXctbW9kdWxlJztcbmltcG9ydCBUcmFuc2l0aW9uRW5kIGZyb20gJy4uLy4uLy4uL2xheW91dC9qcy90cmFuc2l0aW9uRW5kJztcbmltcG9ydCBBbmltYXRpb24gZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL2FuaW1hdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGVnb3JpZXMgZXh0ZW5kcyBBbmltYXRpb24ge1xuXHRjb25zdHJ1Y3Rvcigpe1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5jb250YWluZXIgPSAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhdGVnb3JpZXMnKTtcblx0XHR0aGlzLmNhdGVnb3JpZXMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY2F0ZWdvcnknKTtcblx0XHR0aGlzLmluZGljYXRvciA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jYXRlZ29yeV9fb3RoZXJDYXRlZ29yaWVzLWluZGljYXRvcicpO1xuXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0dGhpcy5wYWdlRHJhdyA9IG5ldyBQYWdlRHJhdyh7XG5cdFx0XHRpbmRpY2F0aW9uOiB0cnVlLFxuXHRcdFx0cG9zaXRpb246ICdhZnRlcmJlZ2luIC5jYXRlZ29yeV9fZGluYW1pYycsXG5cdFx0XHRjb250ZW50OiAoZGF0YSkgPT4ge1xuXHRcdFx0XHRjb25zdCB7aGVhZCwgdGV4dCwgY2xhc3NOYW1lfSA9IGRhdGE7XG5cdFx0XHRcdGNvbnN0IGJnID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmNhdGVnb3J5X19iZycpO1xuXHRcdFx0XHRiZy5jbGFzc05hbWUgPSBgY2F0ZWdvcnlfX2JnICR7Y2xhc3NOYW1lfWA7XG5cdFx0XHRcdHJldHVybiBgXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhdGVnb3J5X19oZWFkIGJsb2NrTmFtZVwiPiR7aGVhZH08L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2F0ZWdvcnlfX3RleHRcIj5cblx0XHRcdFx0XHRcdCR7dGV4dH1cblx0ICAgICAgXHQ8L2Rpdj5cblx0XHRcdFx0YDtcblx0XHRcdH0sXG5cdFx0XHRzaG93KCl7XG5cdFx0XHRcdHRoaXMuYmxvY2sucXVlcnlTZWxlY3RvcignLmNhdGVnb3J5X19oZWFkJykuY2xhc3NMaXN0LmFkZCgnY2F0ZWdvcnlfX2hlYWQtLWFuaW1hdGUnKTtcblx0XHRcdFx0dGhpcy5ibG9jay5xdWVyeVNlbGVjdG9yKCcuY2F0ZWdvcnlfX3RleHQnKS5jbGFzc0xpc3QuYWRkKCdjYXRlZ29yeV9fdGV4dC0tYW5pbWF0ZScpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMuaW1hZ2VQYWdlRHJhdyA9IG5ldyBQYWdlRHJhdyh7XG5cdFx0XHRjbGFzczonY2F0ZWdvcmllc19faW1hZ2UnLFxuXHRcdFx0cG9zaXRpb246ICdiZWZvcmViZWdpbiAuY2F0ZWdvcmllc19fY2FyZHNDb250YWluZXInLFxuXHRcdFx0Y29udGVudChkYXRhKSB7XG5cdFx0XHRcdHRoaXMuYmxvY2suc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDp1cmwoJHtkYXRhLnVybCB8fCAnaW1hZ2VzL25hbm8uanBnJ30pIDUwJSA1MCUvY292ZXIgbm8tcmVwZWF0O1xuXHRcdFx0XHQgXHRcdFx0XHRcdFx0XHRcdFx0XHR3aWR0aDoxMDAlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvcGFjaXR5OjA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNDBweClcIj48L2Rpdj5gXG5cdFx0XHR9LFxuXHRcdFx0c2hvdygpe1xuXHRcdFx0XHRjb25zdCBpbWFnZSA9IHRoaXMuYmxvY2suZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdGltYWdlLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsIC4zcyBlYXNlJztcblx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XG5cdFx0XHRcdCBcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXHRcdFx0XHRcdFx0aW1hZ2Uuc3R5bGUub3BhY2l0eSA9IDE7XG5cdFx0XHRcdFx0XHRpbWFnZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgwcHgpJztcblx0XHRcdFx0IFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9LFxuXHRcdFx0aGlkZSgpe1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoICggcmVzb2x2ZSwgcmVqZWN0ICkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGltYWdlID0gdGhpcy5ibG9jay5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRpbWFnZS5zdHlsZS5vcGFjaXR5ID0gMDtcblx0XHRcdFx0XHRpbWFnZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNDBweCknO1xuXHRcdFx0XHRcdG5ldyBUcmFuc2l0aW9uRW5kKHtcblx0XHRcdFx0XHRcdGVsZW1lbnQ6IGltYWdlLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0dGhpcy5pbWFnZVBhZ2VEcmF3LmxvY2FsRGF0YSA9IHt9O1xuXHRcdHRoaXMuaW1hZ2VQYWdlRHJhdy5kcmF3O1xuXHRcdHRoaXMucGFnZURyYXcuY2hpbGQgPSB0aGlzLmltYWdlUGFnZURyYXc7XG5cblx0XHR0aGlzLnRvZ2dsZXJzKCk7XG5cdFx0dGhpcy5iZ0JhbGxBbmltYXRlKCk7XG5cdFx0dGhpcy5jbG9zZUNhdGVnb3JpZXMoKTtcblx0fVxuXG5cdHRvZ2dsZXJzKGNhdGVnb3J5KSB7XG5cdFx0dGhpcy5vYmogPSBKU09OLnBhcnNlKHRoaXMuY29udGFpbmVyLmRhdGFzZXQuY2F0ZWdvcmllcyk7XG5cblx0XHRsZXQgZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhdGVnb3J5X19vdGhlckNhdGVnb3JpZXMtaXRlbXMgbGknKTtcblxuXHRcdHRoaXMuc2V0SW5kaWNhdG9yUG9zaXRpb24oZWxzWzBdKTtcblxuXHRcdFtdLmZvckVhY2guY2FsbChlbHMsIChpdGVtLCBpbmRleCkgPT4ge1xuXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdFx0W10uZm9yRWFjaC5jYWxsKGVscywgKGl0ZW0sIGluZGV4KSA9PiB7XG5cdFx0XHRcdFx0aXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aXRlbS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcblx0XHRcdFx0Y29uc3Qgd2lkdGggPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGl0ZW0pLndpZHRoKTtcblxuXHRcdFx0XHR0aGlzLnBhZ2VEcmF3LmxvY2FsRGF0YSA9IHRoaXMub2JqW2luZGV4XTtcblx0XHRcdFx0dGhpcy5pbWFnZVBhZ2VEcmF3LmxvY2FsRGF0YSA9IHRoaXMub2JqW2luZGV4XTtcblx0XHRcdFx0dGhpcy5wYWdlRHJhdy5kcmF3O1xuXHRcdFx0XHR0aGlzLnNldEluZGljYXRvclBvc2l0aW9uKGl0ZW0pO1xuXHRcdFx0fSk7XG5cblx0XHR9KTtcblxuXHR9XG5cblx0c2V0SW5kaWNhdG9yUG9zaXRpb24oaXRlbSkge1xuXHRcdGNvbnN0IHRvZ2dsZXJzQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY2F0ZWdvcnlfX290aGVyQ2F0ZWdvcmllcy1pdGVtcycpWzBdO1xuXHRcdGNvbnN0IHRvZ2dsZXJzQ29vcmRzID0gdG9nZ2xlcnNDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgaW5kaWNhdG9yQ29vcmRzID0gdGhpcy5pbmRpY2F0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgaXRlbUNvb3JkcyA9IGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR0aGlzLmluZGljYXRvci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cdFx0dGhpcy5pbmRpY2F0b3Iuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgLjNzIGVhc2UnO1xuXHRcdHRoaXMuaW5kaWNhdG9yLnN0eWxlLndpZHRoID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpdGVtKS53aWR0aCkgKyAncHgnO1xuXHRcdHRoaXMuaW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBpdGVtQ29vcmRzLmxlZnQgLSB0b2dnbGVyc0Nvb3Jkcy5sZWZ0ICsgJ3B4JztcblxuXHR9XG5cblx0YmdCYWxsQW5pbWF0ZSgpIHtcblx0XHRsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhdGVnb3J5X190aXRsZUNhcmRzJyk7XG5cdFx0bGV0IGNhcmRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXRlZ29yeV9fY2FyZCcpO1xuXHRcdFtdLmZvckVhY2guY2FsbChjYXJkcywgY2FyZCA9PiB7XG5cblx0XHRcdGNhcmQuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZXZlbnQgPT4ge1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lckNvb3JkcyA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdFx0XHRjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0ZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRcdFx0ZGl2LnN0eWxlLmJvcmRlclJhZGl1cyA9ICcxMDAwMHB4Jztcblx0XHRcdFx0ZGl2LnN0eWxlLmJveFNoYWRvdyA9ICcwIDRweCAxNnB4IHJnYmEoMCwwLDAsLjEpJztcblx0XHRcdFx0Y29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuXHRcdFx0XHRsZXQgY2xhc3NOYW1lcyA9IGNhcmQuY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG5cdFx0XHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnLS0nKTtcblx0XHRcdFx0Y2xhc3NOYW1lcy5mb3JFYWNoKCBpdGVtID0+IHtcblx0XHRcdFx0XHRpZiAoIHJlZ2V4LnRlc3QoaXRlbSkgKSB7XG5cdFx0XHRcdFx0XHRjbGFzc05hbWVzID0gaXRlbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY2xhc3NOYW1lcyBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRpdi5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWVzICk7XG5cblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG5cdFx0XHRcdGNvbnN0IHsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tIH0gPSBjb250YWluZXJDb29yZHM7XG5cdFx0XHRcdGxldCB7IHggLHkgfSA9IGV2ZW50O1xuXHRcdFx0XHR4ID0geCAtIGxlZnQ7XG5cdFx0XHRcdHkgPSB5IC0gdG9wO1xuXHRcdFx0XHRjb25zdCBoZWlnaHQgPSAoYm90dG9tLXRvcCk7XG5cdFx0XHRcdGNvbnN0IHdpZHRoID0gKHJpZ2h0LWxlZnQpO1xuXHRcdFx0XHRjb25zdCBTaXplID0gTWF0aC5zcXJ0KGhlaWdodCAqKiAyICsgd2lkdGggKiogMik7XG5cblx0XHRcdFx0ZGlzYWJsZUFjdGl2ZUljb24oKTtcblxuXHRcdFx0XHRjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuXG5cdFx0XHRcdFx0Y29uc3QgcHJvZ3Jlc3MgPSB0aGlzLl9fcHJvZ3Jlc3Moc3RhcnQsNTAwKTtcblx0XHRcdFx0XHRjb25zdCBwcm9ncmVzc1NpemUgPSBTaXplICogcHJvZ3Jlc3M7XG5cblx0XHRcdFx0XHRkaXYuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXHRcdFx0XHRcdGRpdi5zdHlsZS5oZWlnaHQgPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXG5cdFx0XHRcdFx0bGV0IHRvcCA9IHkgKyAoKGhlaWdodC8yIC0geSkgLSBTaXplLzIpICogcHJvZ3Jlc3M7XG5cdFx0XHRcdFx0bGV0IGxlZnQgPSB4ICsgKCh3aWR0aC8yIC0geCkgLSBTaXplLzIpICogcHJvZ3Jlc3M7XG5cblx0XHRcdFx0XHRkaXYuc3R5bGUudG9wID0gdG9wICsgJ3B4Jztcblx0XHRcdFx0XHRkaXYuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnO1xuXG5cdFx0XHRcdFx0aWYgKHByb2dyZXNzID09PSAxKSB7XG5cblx0XHRcdFx0XHRcdGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHRcdFx0ZGl2LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5mYWRlSW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhdGVnb3J5X19kaW5hbWljJykse1xuXHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogNDAwXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9iai5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vYmpbaV0uY2xhc3NOYW1lID09IGNsYXNzTmFtZXMpe1xuXHRcdFx0XHRcdFx0XHRcdHZhciBhY3RpdmVJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhdGVnb3J5X19vdGhlckNhdGVnb3JpZXMtaXRlbXMgbGknKVtpXTtcblx0XHRcdFx0XHRcdFx0XHRhY3RpdmVJdGVtLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGFnZURyYXcubG9jYWxEYXRhID0gdGhpcy5vYmpbaV07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pbWFnZVBhZ2VEcmF3LmxvY2FsRGF0YSA9IHRoaXMub2JqW2ldO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGFnZURyYXcuZHJhdztcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldEluZGljYXRvclBvc2l0aW9uKGFjdGl2ZUl0ZW0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0ZnVuY3Rpb24gZGlzYWJsZUFjdGl2ZUljb24oKXtcblx0XHRcdFx0bGV0IGljb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhdGVnb3J5X19vdGhlckNhdGVnb3JpZXMtaXRlbXMgbGkuYWN0aXZlJyk7XG5cblx0XHRcdFx0W10uZm9yRWFjaC5jYWxsKCBpY29ucywgKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNsb3NlQ2F0ZWdvcmllcygpIHtcblx0XHRjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhdGVnb3J5X19jbG9zZScpWzBdO1xuXHRcdGNvbnN0IGNhcmRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY2F0ZWdvcnlfX3RpdGxlQ2FyZHMnKVswXTtcblx0XHRjb25zdCBjYXJkcyA9IGNhcmRzQ29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhdGVnb3J5X19jYXJkJyk7XG5cblx0XHRjb25zdCBtYXRyaXgyID0gW1xuXHRcdFx0LTEsIC0xLFxuXHRcdFx0IDEsICAxXG5cdFx0XVxuXHRcdGNvbnN0IG1hdHJpeDEgPSBbXG5cdFx0XHQtMSwgMSxcblx0XHRcdC0xLCAxXG5cdFx0XVxuXHRcdGNvbnN0IHZhbHVlID0gMTA7XG5cblx0XHRjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRjYXJkc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuXHRcdFx0W10uZm9yRWFjaC5jYWxsKGNhcmRzLCAoY2FyZCwgaW5kZXgpID0+IHtcblx0XHRcdFx0Y2FyZC5zdHlsZS5vcGFjaXR5ID0gMDtcblx0XHRcdFx0Y2FyZC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7bWF0cml4MVtpbmRleF0gKiB2YWx1ZX0lLCR7bWF0cml4MltpbmRleF0gKiB2YWx1ZX0lKWA7XG5cdFx0XHRcdGNhcmQuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgLjNzIGVhc2UnO1xuXG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y2FyZC5zdHlsZS5vcGFjaXR5ID0gMTtcblx0XHRcdFx0XHRcdGNhcmQuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwJSwwJSknO1xuXHRcdFx0XHRcdFx0dGhpcy5pbWFnZVBhZ2VEcmF3LmxvY2FsRGF0YSA9IHt9O1xuXHRcdFx0XHRcdFx0dGhpcy5pbWFnZVBhZ2VEcmF3LmRyYXc7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==*/