angular-gallery
Version:
Responsive gallery for Angular with touch screen support.
472 lines • 60.4 kB
JavaScript
var Carousel = /** @class */ (function () {
function Carousel(properties) {
var _this = this;
this.initialPositionX = 0;
this.newContainerPositionIndex = 0; // The index of the new position relative to the active index, for example -1 or +1
this.preliminarySlideCounter = 0;
this.slideCounter = 0; // Scrolling Index (counter)
this.previousSlideCounter = 0;
this.isContentImages = true;
this.isLazyLoad = true;
this.isContainerLocked = false;
this.alignCells = "left";
this.initialContainerPosition = 0;
this.handleTouchstart = function (event) {
_this.isTouchstart = true;
if (_this.isSlideInProgress) {
return;
}
var touches = event.touches;
if (touches) {
_this.startX = touches[0].clientX - _this.getCarouselElementPosition()['left'];
}
else {
_this.startX = event.clientX - _this.getCarouselElementPosition()['left'];
}
_this.containerInitialPositionX = _this.getElementPosition()['left'] - _this.getCarouselElementPosition()['left'];
_this.isMoveInProgress = true;
};
this.handleHorizontalSwipe = function (event) {
if (_this.isSlideInProgress) {
return;
}
var touches = event.touches;
if (touches) {
_this.moveX = touches[0].clientX - _this.getCarouselElementPosition()['left'];
}
else {
_this.moveX = event.clientX - _this.getCarouselElementPosition()['left'];
}
_this.distanceAbs = _this.getDistanceAbs();
_this.direction = _this.getDirection();
_this.moveContainer();
};
this.handleTouchend = function (event) {
if (_this.isSlideInProgress || !_this.isTouchstart) {
_this.isTouchstart = false;
return;
}
_this.isMoveInProgress = false;
if (_this.detectSlide()) {
_this.handleSlide();
}
else {
_this.newContainerPositionIndex = 0;
_this.alignContainer();
}
_this.startX = _this.moveX = _this.distanceAbs = undefined;
_this.isTouchstart = false;
};
this.element = properties.element;
this.properties = properties;
this.cells = this.element.children;
this.visibleWidth = this.properties.visibleWidth || this.element.parentElement.clientWidth;
this.setContainerWidth();
this.alignContainer(0);
}
Object.defineProperty(Carousel.prototype, "isFirstCell", {
get: function () {
return this.slideCounter === 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "lastCellIndex", {
get: function () {
return this.images.length ? (this.images.length - 1) : (this.cells.length - 1);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "overflowCellsLimit", {
get: function () {
return this.properties.overflowCellsLimit;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "cellLimit", {
get: function () {
return this.visibleCellsCount + this.overflowCellsLimit * 2;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "images", {
get: function () {
return this.properties.images;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "margin", {
get: function () {
return this.properties.margin;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "minSwipeDistance", {
get: function () {
return this.properties.minSwipeDistance;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "transitionDuration", {
get: function () {
return this.properties.transitionDuration;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "transitionTimingFunction", {
get: function () {
return this.properties.transitionTimingFunction;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "fullCellWidth", {
get: function () {
return this.properties.cellWidth + this.margin;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "visibleCellsCount", {
get: function () {
return Math.ceil(this.visibleWidth / this.fullCellWidth);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "lapCounter", {
get: function () {
return Math.floor(this.slideCounter / this.totalContainerCellsCount);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Carousel.prototype, "visibleCellsOverflowContainer", {
get: function () {
return (this.visibleCellsCount * this.fullCellWidth - this.margin) > this.visibleWidth;
},
enumerable: true,
configurable: true
});
/* Move */
Carousel.prototype.moveContainer = function () {
var positionX = this.getMovePositionX();
this.transformPositionX(positionX, 0);
};
Carousel.prototype.getMovePositionX = function () {
var distance = this.getDistance();
return this.containerInitialPositionX - distance;
};
/* Align */
Carousel.prototype.alignContainer = function (duration) {
if (duration === void 0) { duration = this.transitionDuration; }
var positionX = this.getContainerPosition();
this.transformPositionX(positionX, duration);
this.setInitialContainerPosition(positionX);
};
Carousel.prototype.getContainerPosition = function () {
var correction = this.getContainerPositionCorrection();
this.isContainerPositionCorrection = correction != 0;
return (this.initialContainerPosition + this.newContainerPositionIndex * this.fullCellWidth) + correction;
};
Carousel.prototype.setInitialContainerPosition = function (position) {
var correction = this.getContainerPositionCorrection();
this.initialContainerPosition = position - correction;
};
Carousel.prototype.getContainerPositionCorrection = function () {
var correction = 0;
if ((this.images.length - this.preliminarySlideCounter) < this.visibleCellsCount || this.isSlideLengthLimited) {
if (this.visibleWidth < this.totalContainerCellsCount * this.fullCellWidth) {
correction = -(this.visibleCellsCount * this.fullCellWidth - this.visibleWidth - this.margin);
}
if (correction >= -this.margin) {
correction = 0;
}
}
return correction;
};
/* Quickly center */
Carousel.prototype.quicklyPositionContainer = function () {
var correction = this.getContainerPositionCorrection();
var initialPosition = this.getNewContainerPosition() + correction;
this.transformPositionX(initialPosition, 0);
this.setInitialContainerPosition(initialPosition);
};
Carousel.prototype.getNewContainerPosition = function () {
if (this.slideCounter > this.overflowCellsLimit) {
if (this.alignCells === "left") {
this.lineUpCells();
return -(this.overflowCellsLimit * this.fullCellWidth);
}
}
if (this.slideCounter <= this.overflowCellsLimit) {
if (this.previousSlideCounter > this.overflowCellsLimit) {
this.lineUpCells();
}
return -(this.slideCounter * this.fullCellWidth);
}
};
Carousel.prototype.setContainerWidth = function () {
var containerWidth = this.getContainerWidth();
this.element.style.width = containerWidth + "px";
};
Carousel.prototype.getContainerWidth = function () {
this.totalContainerCellsCount = this.visibleCellsCount + this.overflowCellsLimit * 2;
var containerWidth = this.totalContainerCellsCount * this.fullCellWidth;
var totalImageWidth = this.images.length * this.fullCellWidth;
if (totalImageWidth < containerWidth) {
containerWidth = totalImageWidth;
}
return containerWidth;
};
Carousel.prototype.getFile = function (cellIndex) {
var imageIndex = this.getFileIndex(cellIndex);
var file = this.images[imageIndex];
if (file && !file.type) {
file.type = 'image';
}
return {
image: this.images[imageIndex],
imageIndex: imageIndex
};
};
Carousel.prototype.getFileIndex = function (cellIndex) {
var positionIndex = this.getPositionIndex(cellIndex);
var numberLeftCells = (this.totalContainerCellsCount - 1) / 2;
var imageIndex;
if (!this.isContainerLocked) {
if (this.slideCounter <= this.overflowCellsLimit) {
return cellIndex;
}
else {
var cellLimitOverflow = this.slideCounter - this.overflowCellsLimit;
imageIndex = positionIndex + cellLimitOverflow;
return imageIndex;
}
}
if (this.alignCells === "left") {
if (this.slideCounter > this.overflowCellsLimit) {
var cellLimitOverflow = this.slideCounter - this.overflowCellsLimit;
imageIndex = positionIndex + cellLimitOverflow;
}
else {
imageIndex = cellIndex;
}
}
if (imageIndex > this.lastCellIndex) {
return false;
}
return imageIndex;
};
Carousel.prototype.transformPositionX = function (value, duration) {
if (duration === void 0) { duration = this.transitionDuration; }
this.element.style.transition = 'transform ' + duration + 'ms ' + this.transitionTimingFunction;
this.element.style.transform = 'translateX(' + value + 'px)';
};
Carousel.prototype.detectSlide = function () {
return this.distanceAbs >= this.minSwipeDistance;
};
Carousel.prototype.next = function () {
if (this.isSlideInProgress) {
return;
}
this.direction = 'left';
this.handleSlide(1);
};
Carousel.prototype.prev = function () {
if (this.isSlideInProgress) {
return;
}
this.direction = 'right';
this.handleSlide(1);
};
Carousel.prototype.select = function (index) {
this.slideCounter = index;
this.quicklyPositionContainer();
};
Carousel.prototype.handleSlide = function (slideLength) {
if (slideLength === void 0) { slideLength = undefined; }
this.slideLength = this.getSlideLength();
this.slideLength = slideLength ? slideLength : this.limitSlideLength(this.slideLength);
if (this.direction === 'left' && !this.isSlideInProgress) {
this.preliminarySlideCounter = this.slideCounter + this.slideLength;
if (!this.detectLastSlide(this.slideCounter + this.slideLength)) {
this.newContainerPositionIndex = this.newContainerPositionIndex - this.slideLength;
this.isSlideInProgress = true;
if (this.isLazyLoad) {
this.isContainerLocked = this.preliminarySlideCounter > this.overflowCellsLimit;
if (this.detectContainerUnlock()) {
this.isContainerLocked = false;
}
}
}
}
if (this.direction === 'right' && !this.isSlideInProgress) {
if (this.slideCounter - this.slideLength < 0) {
this.slideLength = this.slideCounter;
}
this.preliminarySlideCounter = this.slideCounter - this.slideLength;
if (!this.isFirstCell) {
this.newContainerPositionIndex = this.newContainerPositionIndex + this.slideLength;
this.isSlideInProgress = true;
if (this.isLazyLoad) {
if (this.preliminarySlideCounter > this.overflowCellsLimit) {
this.isContainerLocked = true;
}
else {
this.isContainerLocked = false;
}
if (this.detectContainerUnlock()) {
this.isContainerLocked = false;
}
}
}
}
this.alignContainer();
};
Carousel.prototype.getSlideLength = function () {
var correction = this.getContainerPositionCorrection();
var length = Math.floor((this.distanceAbs + correction) / this.fullCellWidth);
if (this.distanceAbs % this.fullCellWidth >= this.minSwipeDistance) {
length++;
}
return length;
};
Carousel.prototype.limitSlideLength = function (slideLength) {
if (slideLength > 1) {
for (var i = 0; i < slideLength; i++) {
var newSlideCounter = this.slideCounter + (slideLength - i);
if (!this.detectLastSlide(newSlideCounter)) {
slideLength = slideLength - i;
this.isSlideLengthLimited = i > 0;
break;
}
}
}
return slideLength;
};
Carousel.prototype.detectLastSlide = function (slideCounter) {
return (this.images.length - slideCounter) < this.visibleCellsCount;
};
Carousel.prototype.isNextArrowDisabled = function () {
if (this.visibleCellsOverflowContainer) {
return this.detectLastSlide(this.slideCounter + 1) && this.isContainerPositionCorrection;
}
else {
return this.detectLastSlide(this.slideCounter + 1);
}
};
Carousel.prototype.isPrevArrowDisabled = function () {
return this.slideCounter === 0;
};
Carousel.prototype.detectContainerUnlock = function () {
return (this.images.length - this.preliminarySlideCounter) < (this.visibleCellsCount + this.overflowCellsLimit);
};
Carousel.prototype.handleSlideEnd = function () {
if (this.isSlideInProgress) {
this.transformSlideEnd();
this.isSlideInProgress = false;
this.newContainerPositionIndex = 0;
this.isSlideLengthLimited = undefined;
}
};
Carousel.prototype.transformSlideEnd = function () {
if (this.isLazyLoad) {
this.setSlideCounter();
this.quicklyPositionContainer();
}
this.previousSlideCounter = this.slideCounter;
};
Carousel.prototype.setSlideCounter = function () {
if (this.direction === 'left') {
this.slideCounter = this.slideCounter + this.slideLength;
}
if (this.direction === 'right') {
this.slideCounter = this.slideCounter - this.slideLength;
}
this.direction = undefined;
this.slideLength = 0;
};
Carousel.prototype.resetTransition = function () {
this.element.style.transition = '';
};
Carousel.prototype.getElementPosition = function () {
return this.element.getBoundingClientRect();
};
Carousel.prototype.getCarouselElementPosition = function () {
return this.properties.container.getBoundingClientRect();
};
Carousel.prototype.getDistance = function () {
return this.startX - this.moveX;
};
Carousel.prototype.getDistanceAbs = function () {
return Math.abs(this.startX - this.moveX);
};
Carousel.prototype.getDirection = function () {
var direction = Math.sign(this.startX - this.moveX);
if (direction === -1) {
return 'right';
}
if (direction === 1) {
return 'left';
}
};
Carousel.prototype.lineUpCells = function () {
var cells = this.element.children;
for (var i = 0; i < cells.length; i++) {
var cell = cells[i];
var positionX = this.getCellPositionX(i);
cell.style.transform = 'translateX(' + positionX + 'px)';
}
;
};
Carousel.prototype.getCellPositionX = function (index) {
var positionIndex = this.getPositionIndex(index);
return positionIndex * this.fullCellWidth;
};
Carousel.prototype.getPositionIndex = function (cellIndex) {
var slideCounter = this.slideCounter - this.overflowCellsLimit;
var positionIndex;
if (slideCounter > this.totalContainerCellsCount) {
slideCounter = slideCounter % this.totalContainerCellsCount;
}
if (slideCounter < 0) {
return cellIndex;
}
else {
positionIndex = cellIndex - slideCounter;
if (positionIndex < 0) {
positionIndex = this.totalContainerCellsCount + positionIndex;
}
}
return positionIndex;
};
Object.defineProperty(Carousel.prototype, "containerOverflowRightCount", {
get: function () {
var totalOverflowCellsCount = this.images.length - this.totalContainerCellsCount;
var overflowRight = 0;
if (totalOverflowCellsCount > 0) {
overflowRight = totalOverflowCellsCount - (this.previousSlideCounter - this.overflowCellsLimit);
if (overflowRight > 0) {
return overflowRight;
}
}
return overflowRight;
},
enumerable: true,
configurable: true
});
Carousel.prototype.getCenterPositionIndex = function () {
return (this.totalContainerCellsCount - 1) / 2;
};
return Carousel;
}());
export { Carousel };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWdhbGxlcnkvIiwic291cmNlcyI6WyJsaWIvY2Fyb3VzZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0E7SUFvRkksa0JBQVksVUFBc0I7UUFBbEMsaUJBUUM7UUFwRkQscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBRzdCLDhCQUF5QixHQUFXLENBQUMsQ0FBQyxDQUFDLG1GQUFtRjtRQUMxSCw0QkFBdUIsR0FBVyxDQUFDLENBQUM7UUFDcEMsaUJBQVksR0FBVyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7UUFDdEQseUJBQW9CLEdBQVcsQ0FBQyxDQUFDO1FBVWpDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR2hDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFXLENBQUMsQ0FBQztRQWdFckMscUJBQWdCLEdBQUcsVUFBQyxLQUFVO1lBQzFCLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBRXpCLElBQUksS0FBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFFRCxJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzlCLElBQUksT0FBTyxFQUFFO2dCQUNULEtBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoRjtpQkFBTTtnQkFDSCxLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0U7WUFDRCxLQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0csS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDLENBQUE7UUFFRCwwQkFBcUIsR0FBRyxVQUFDLEtBQVU7WUFDL0IsSUFBSSxLQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3hCLE9BQU87YUFDVjtZQUVELElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDOUIsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsS0FBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9FO2lCQUFNO2dCQUNILEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMxRTtZQUNELEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXJDLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUE7UUFFRCxtQkFBYyxHQUFHLFVBQUMsS0FBVTtZQUN4QixJQUFJLEtBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlDLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixPQUFPO2FBQ1Y7WUFFRCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBRTlCLElBQUksS0FBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNwQixLQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLHlCQUF5QixHQUFHLENBQUMsQ0FBQztnQkFDbkMsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO1lBRUQsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQ3hELEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUMsQ0FBQTtRQTVERyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUUzRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUE1REQsc0JBQUksaUNBQVc7YUFBZjtZQUNJLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxtQ0FBYTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx3Q0FBa0I7YUFBdEI7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwrQkFBUzthQUFiO1lBQ0ksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUNoRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDRCQUFNO2FBQVY7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2xDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksNEJBQU07YUFBVjtZQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxzQ0FBZ0I7YUFBcEI7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7UUFDNUMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx3Q0FBa0I7YUFBdEI7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw4Q0FBd0I7YUFBNUI7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7UUFDcEQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxtQ0FBYTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuRCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHVDQUFpQjthQUFyQjtZQUNJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLGdDQUFVO2FBQWQ7WUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN6RSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLG1EQUE2QjthQUFqQztZQUNJLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMxRixDQUFDOzs7T0FBQTtJQWlFRCxVQUFVO0lBQ1YsZ0NBQWEsR0FBYjtRQUNJLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELG1DQUFnQixHQUFoQjtRQUNJLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxRQUFRLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVc7SUFDWCxpQ0FBYyxHQUFkLFVBQWUsUUFBMEM7UUFBMUMseUJBQUEsRUFBQSxXQUFtQixJQUFJLENBQUMsa0JBQWtCO1FBQ3JELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCx1Q0FBb0IsR0FBcEI7UUFDSSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQzlHLENBQUM7SUFFRCw4Q0FBMkIsR0FBM0IsVUFBNEIsUUFBUTtRQUNoQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsaURBQThCLEdBQTlCO1FBQ0ksSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNHLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDeEUsVUFBVSxHQUFHLENBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNsRztZQUVELElBQUksVUFBVSxJQUFJLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDN0IsVUFBVSxHQUFHLENBQUMsQ0FBQzthQUNsQjtTQUNKO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELG9CQUFvQjtJQUNwQiwyQ0FBd0IsR0FBeEI7UUFDSSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN2RCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDBDQUF1QixHQUF2QjtRQUNJLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDN0MsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzFEO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzlDLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDcEQ7SUFDTCxDQUFDO0lBRUQsb0NBQWlCLEdBQWpCO1FBQ0ksSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVELG9DQUFpQixHQUFqQjtRQUNJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUNyRixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4RSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTlELElBQUksZUFBZSxHQUFHLGNBQWMsRUFBRTtZQUNsQyxjQUFjLEdBQUcsZUFBZSxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQztJQUVELDBCQUFPLEdBQVAsVUFBUSxTQUFTO1FBQ2IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztTQUN2QjtRQUVELE9BQU87WUFDSCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDOUIsVUFBVSxZQUFBO1NBQ2IsQ0FBQztJQUNOLENBQUM7SUFFRCwrQkFBWSxHQUFaLFVBQWEsU0FBaUI7UUFDMUIsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxJQUFJLFVBQVUsQ0FBQztRQUVmLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDOUMsT0FBTyxTQUFTLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0gsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDcEUsVUFBVSxHQUFHLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztnQkFDL0MsT0FBTyxVQUFVLENBQUM7YUFDckI7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDN0MsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDcEUsVUFBVSxHQUFHLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQzthQUNsRDtpQkFBTTtnQkFDSCxVQUFVLEdBQUcsU0FBUyxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELHFDQUFrQixHQUFsQixVQUFtQixLQUFLLEVBQUUsUUFBa0M7UUFBbEMseUJBQUEsRUFBQSxXQUFXLElBQUksQ0FBQyxrQkFBa0I7UUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUNoRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDakUsQ0FBQztJQUVELDhCQUFXLEdBQVg7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3JELENBQUM7SUFFRCx1QkFBSSxHQUFKO1FBQ0ksSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsdUJBQUksR0FBSjtRQUNJLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELHlCQUFNLEdBQU4sVUFBTyxLQUFhO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCw4QkFBVyxHQUFYLFVBQVksV0FBK0I7UUFBL0IsNEJBQUEsRUFBQSx1QkFBK0I7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV2RixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3RELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFFcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzdELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFFOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFFaEYsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRTt3QkFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztxQkFDbEM7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUN4QztZQUVELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFFcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFFOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNqQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7cUJBQ2pDO3lCQUFNO3dCQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7cUJBQ2xDO29CQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUU7d0JBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7cUJBQ2xDO2lCQUNKO2FBQ0o7U0FDSjtRQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUNBQWMsR0FBZDtRQUNJLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3ZELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5RSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDaEUsTUFBTSxFQUFFLENBQUM7U0FDWjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxtQ0FBZ0IsR0FBaEIsVUFBaUIsV0FBbUI7UUFDaEMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRTVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUN4QyxXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xDLE1BQU07aUJBQ1Q7YUFDSjtTQUNKO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELGtDQUFlLEdBQWYsVUFBZ0IsWUFBb0I7UUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN4RSxDQUFDO0lBRUQsc0NBQW1CLEdBQW5CO1FBQ0ksSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLDZCQUE2QixDQUFDO1NBQzVGO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0RDtJQUNMLENBQUM7SUFFRCxzQ0FBbUIsR0FBbkI7UUFDSSxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCx3Q0FBcUIsR0FBckI7UUFDSSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUVELGlDQUFjLEdBQWQ7UUFDSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUV6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxvQ0FBaUIsR0FBakI7UUFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDbEQsQ0FBQztJQUVELGtDQUFlLEdBQWY7UUFDSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM1RDtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQ0FBZSxHQUFmO1FBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQscUNBQWtCLEdBQWxCO1FBQ0ksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELDZDQUEwQixHQUExQjtRQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsOEJBQVcsR0FBWDtRQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQ0FBYyxHQUFkO1FBQ0ksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCwrQkFBWSxHQUFaO1FBQ0ksSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RCxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNsQixPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUNELElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCw4QkFBVyxHQUFYO1FBQ0ksSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFvQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDN0U7UUFBQSxDQUFDO0lBQ04sQ0FBQztJQUVELG1DQUFnQixHQUFoQixVQUFpQixLQUFLO1FBQ2xCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxPQUFPLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlDLENBQUM7SUFFRCxtQ0FBZ0IsR0FBaEIsVUFBaUIsU0FBUztRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMvRCxJQUFJLGFBQWEsQ0FBQztRQUVsQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDOUMsWUFBWSxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDL0Q7UUFFRCxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7YUFBTTtZQUNILGFBQWEsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQ3pDLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsYUFBYSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxhQUFhLENBQUM7YUFDakU7U0FDSjtRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxzQkFBSSxpREFBMkI7YUFBL0I7WUFDSSxJQUFJLHVCQUF1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztZQUNqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFFdEIsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLGFBQWEsR0FBRyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFFaEcsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO29CQUNuQixPQUFPLGFBQWEsQ0FBQztpQkFDeEI7YUFDSjtZQUVELE9BQU8sYUFBYSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBRUQseUNBQXNCLEdBQXRCO1FBQ0ksT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQUFDLEFBM2dCRCxJQTJnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMge1xyXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgaW1hZ2VzOiBhbnk7XHJcbiAgICBjZWxsV2lkdGg6IG51bWJlcjtcclxuICAgIG92ZXJmbG93Q2VsbHNMaW1pdDogbnVtYmVyO1xyXG4gICAgdmlzaWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICBtYXJnaW46IG51bWJlcjtcclxuICAgIG1pblN3aXBlRGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHRyYW5zaXRpb25EdXJhdGlvbjogbnVtYmVyO1xyXG4gICAgdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiAnZWFzZScgfCAnZWFzZS1pbicgfCAnZWFzZS1vdXQnIHwgJ2Vhc2UtaW4tb3V0JyB8ICdsaW5lYXInO1xyXG4gICAgdmlkZW9Qcm9wZXJ0aWVzOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbCB7XHJcbiAgICBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzO1xyXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBzdGFydFg6IG51bWJlcjtcclxuICAgIG1vdmVYOiBudW1iZXI7XHJcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XHJcbiAgICBzbGlkZUxlbmd0aDogbnVtYmVyO1xyXG4gICAgZGlzdGFuY2VBYnM6IG51bWJlcjtcclxuICAgIGluaXRpYWxQb3NpdGlvblg6IG51bWJlciA9IDA7XHJcbiAgICBjZWxsczogSFRNTENvbGxlY3Rpb247XHJcblxyXG4gICAgbmV3Q29udGFpbmVyUG9zaXRpb25JbmRleDogbnVtYmVyID0gMDsgLy8gVGhlIGluZGV4IG9mIHRoZSBuZXcgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGFjdGl2ZSBpbmRleCwgZm9yIGV4YW1wbGUgLTEgb3IgKzFcclxuICAgIHByZWxpbWluYXJ5U2xpZGVDb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgc2xpZGVDb3VudGVyOiBudW1iZXIgPSAwOyAvLyBTY3JvbGxpbmcgSW5kZXggKGNvdW50ZXIpXHJcbiAgICBwcmV2aW91c1NsaWRlQ291bnRlcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpc1NsaWRlSW5Qcm9ncmVzczogYm9vbGVhbjtcclxuICAgIGlzTW92ZUluUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgICBpc1RyYW5zaXRpb25JblByb2dyZXNzOiBib29sZWFuO1xyXG4gICAgaXNUb3VjaHN0YXJ0OiBib29sZWFuO1xyXG4gICAgaXNTbGlkZUxlbmd0aExpbWl0ZWQ6IGJvb2xlYW47XHJcbiAgICBpc0NvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbjogYm9vbGVhbjtcclxuXHJcbiAgICBjb250YWluZXJJbml0aWFsUG9zaXRpb25YOiBudW1iZXI7XHJcbiAgICBpc0NvbnRlbnRJbWFnZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmlzaWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICB0b3RhbENvbnRhaW5lckNlbGxzQ291bnQ6IG51bWJlcjtcclxuICAgIGlzTGF6eUxvYWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaXNDb250YWluZXJMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGFsaWduQ2VsbHM6IFwibGVmdFwiIHwgXCJjZW50ZXJcIiA9IFwibGVmdFwiO1xyXG4gICAgaW5pdGlhbENvbnRhaW5lclBvc2l0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGdldCBpc0ZpcnN0Q2VsbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZUNvdW50ZXIgPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhc3RDZWxsSW5kZXgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCA/ICh0aGlzLmltYWdlcy5sZW5ndGggLSAxKSA6ICh0aGlzLmNlbGxzLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvdmVyZmxvd0NlbGxzTGltaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5vdmVyZmxvd0NlbGxzTGltaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNlbGxMaW1pdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ2VsbHNDb3VudCArIHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0ICogMjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1hZ2VzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuaW1hZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXJnaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5tYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1pblN3aXBlRGlzdGFuY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5taW5Td2lwZURpc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0cmFuc2l0aW9uRHVyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy50cmFuc2l0aW9uRHVyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZnVsbENlbGxXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNlbGxXaWR0aCArIHRoaXMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2aXNpYmxlQ2VsbHNDb3VudCgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudmlzaWJsZVdpZHRoIC8gdGhpcy5mdWxsQ2VsbFdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGFwQ291bnRlcigpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnNsaWRlQ291bnRlciAvIHRoaXMudG90YWxDb250YWluZXJDZWxsc0NvdW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZpc2libGVDZWxsc0NvdW50ICogdGhpcy5mdWxsQ2VsbFdpZHRoIC10aGlzLm1hcmdpbikgPiB0aGlzLnZpc2libGVXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gcHJvcGVydGllcy5lbGVtZW50O1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcbiAgICAgICAgdGhpcy5jZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbjtcclxuICAgICAgICB0aGlzLnZpc2libGVXaWR0aCA9IHRoaXMucHJvcGVydGllcy52aXNpYmxlV2lkdGggfHwgdGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgICAgICB0aGlzLmFsaWduQ29udGFpbmVyKDApO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVRvdWNoc3RhcnQgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNUb3VjaHN0YXJ0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7XHJcbiAgICAgICAgaWYgKHRvdWNoZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFggPSB0b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb25YID0gdGhpcy5nZXRFbGVtZW50UG9zaXRpb24oKVsnbGVmdCddIC0gdGhpcy5nZXRDYXJvdXNlbEVsZW1lbnRQb3NpdGlvbigpWydsZWZ0J107XHJcbiAgICAgICAgdGhpcy5pc01vdmVJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVIb3Jpem9udGFsU3dpcGUgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVJblByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xyXG4gICAgICAgIGlmICh0b3VjaGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVggPSB0b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuZ2V0Q2Fyb3VzZWxFbGVtZW50UG9zaXRpb24oKVsnbGVmdCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc3RhbmNlQWJzID0gdGhpcy5nZXREaXN0YW5jZUFicygpO1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb3ZlQ29udGFpbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVG91Y2hlbmQgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVJblByb2dyZXNzIHx8ICF0aGlzLmlzVG91Y2hzdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVG91Y2hzdGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzTW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0U2xpZGUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNsaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5uZXdDb250YWluZXJQb3NpdGlvbkluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hbGlnbkNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdGFydFggPSB0aGlzLm1vdmVYID0gdGhpcy5kaXN0YW5jZUFicyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmlzVG91Y2hzdGFydCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIE1vdmUgKi9cclxuICAgIG1vdmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uWCA9IHRoaXMuZ2V0TW92ZVBvc2l0aW9uWCgpO1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUG9zaXRpb25YKHBvc2l0aW9uWCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW92ZVBvc2l0aW9uWCgpIHtcclxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuZ2V0RGlzdGFuY2UoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb25YIC0gZGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQWxpZ24gKi9cclxuICAgIGFsaWduQ29udGFpbmVyKGR1cmF0aW9uOiBudW1iZXIgPSB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikge1xyXG4gICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUG9zaXRpb25YKHBvc2l0aW9uWCwgZHVyYXRpb24pO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbENvbnRhaW5lclBvc2l0aW9uKHBvc2l0aW9uWCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGFpbmVyUG9zaXRpb24oKSB7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb24gPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uID0gY29ycmVjdGlvbiAhPSAwO1xyXG4gICAgICAgIHJldHVybiAodGhpcy5pbml0aWFsQ29udGFpbmVyUG9zaXRpb24gKyB0aGlzLm5ld0NvbnRhaW5lclBvc2l0aW9uSW5kZXggKiB0aGlzLmZ1bGxDZWxsV2lkdGgpICsgY29ycmVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsQ29udGFpbmVyUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgICAgICBsZXQgY29ycmVjdGlvbiA9IHRoaXMuZ2V0Q29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsQ29udGFpbmVyUG9zaXRpb24gPSBwb3NpdGlvbiAtIGNvcnJlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLmltYWdlcy5sZW5ndGggLSB0aGlzLnByZWxpbWluYXJ5U2xpZGVDb3VudGVyKSA8IHRoaXMudmlzaWJsZUNlbGxzQ291bnQgfHwgdGhpcy5pc1NsaWRlTGVuZ3RoTGltaXRlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlV2lkdGggPCB0aGlzLnRvdGFsQ29udGFpbmVyQ2VsbHNDb3VudCAqIHRoaXMuZnVsbENlbGxXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IC0gKHRoaXMudmlzaWJsZUNlbGxzQ291bnQgKiB0aGlzLmZ1bGxDZWxsV2lkdGggLSB0aGlzLnZpc2libGVXaWR0aCAtIHRoaXMubWFyZ2luKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcnJlY3Rpb24gPj0gLSB0aGlzLm1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb3JyZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFF1aWNrbHkgY2VudGVyICovXHJcbiAgICBxdWlja2x5UG9zaXRpb25Db250YWluZXIoKSB7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb24gPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHRoaXMuZ2V0TmV3Q29udGFpbmVyUG9zaXRpb24oKSArIGNvcnJlY3Rpb247XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1Qb3NpdGlvblgoaW5pdGlhbFBvc2l0aW9uLCAwKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxDb250YWluZXJQb3NpdGlvbihpbml0aWFsUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5ld0NvbnRhaW5lclBvc2l0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlQ291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFsaWduQ2VsbHMgPT09IFwibGVmdFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVVcENlbGxzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLSh0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlQ291bnRlciA8PSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1NsaWRlQ291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVVcENlbGxzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0odGhpcy5zbGlkZUNvdW50ZXIgKiB0aGlzLmZ1bGxDZWxsV2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aCArIFwicHhcIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICB0aGlzLnRvdGFsQ29udGFpbmVyQ2VsbHNDb3VudCA9IHRoaXMudmlzaWJsZUNlbGxzQ291bnQgKyB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIDI7XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lcldpZHRoID0gdGhpcy50b3RhbENvbnRhaW5lckNlbGxzQ291bnQgKiB0aGlzLmZ1bGxDZWxsV2lkdGg7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1hZ2VXaWR0aCA9IHRoaXMuaW1hZ2VzLmxlbmd0aCAqIHRoaXMuZnVsbENlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKHRvdGFsSW1hZ2VXaWR0aCA8IGNvbnRhaW5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoID0gdG90YWxJbWFnZVdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGUoY2VsbEluZGV4KSB7XHJcbiAgICAgICAgbGV0IGltYWdlSW5kZXggPSB0aGlzLmdldEZpbGVJbmRleChjZWxsSW5kZXgpOyBcclxuICAgICAgICBsZXQgZmlsZSA9IHRoaXMuaW1hZ2VzW2ltYWdlSW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoZmlsZSAmJiAhZmlsZS50eXBlKSB7XHJcbiAgICAgICAgICAgIGZpbGUudHlwZSA9ICdpbWFnZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpbWFnZTogdGhpcy5pbWFnZXNbaW1hZ2VJbmRleF0sXHJcbiAgICAgICAgICAgIGltYWdlSW5kZXhcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGVJbmRleChjZWxsSW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uSW5kZXggPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoY2VsbEluZGV4KTtcclxuICAgICAgICBjb25zdCBudW1iZXJMZWZ0Q2VsbHMgPSAodGhpcy50b3RhbENvbnRhaW5lckNlbGxzQ291bnQgLSAxKSAvIDI7XHJcbiAgICAgICAgbGV0IGltYWdlSW5kZXg7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5lckxvY2tlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZUNvdW50ZXIgPD0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZWxsSW5kZXg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2VsbExpbWl0T3ZlcmZsb3cgPSB0aGlzLnNsaWRlQ291bnRlciAtIHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0O1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IHBvc2l0aW9uSW5kZXggKyBjZWxsTGltaXRPdmVyZmxvdztcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZUluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbGlnbkNlbGxzID09PSBcImxlZnRcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZUNvdW50ZXIgPiB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNlbGxMaW1pdE92ZXJmbG93ID0gdGhpcy5zbGlkZUNvdW50ZXIgLSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdDtcclxuICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPSBwb3NpdGlvbkluZGV4ICsgY2VsbExpbWl0T3ZlcmZsb3c7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZUluZGV4ID0gY2VsbEluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW1hZ2VJbmRleCA+IHRoaXMubGFzdENlbGxJbmRleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW1hZ2VJbmRleDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFuc2Z