@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
342 lines (341 loc) • 30.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/*
* Copyright (c) 2017 VMware, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product may include a number of subcomponents with separate copyright notices
* and license terms. Your use of these subcomponents is subject to the terms and
* conditions of the subcomponent's license, as noted in the LICENSE file.
*/
import { Component, Input, Output, ContentChild, ViewChild, ViewChildren, TemplateRef, HostListener, ViewEncapsulation, EventEmitter } from "@angular/core";
import { TranslateService } from "@ngx-translate/core";
/**
* Grid view general component.
*/
export class GridViewComponent {
/**
* @param {?} translate
*/
constructor(translate) {
this.translate = translate;
this.expectScrollPercent = 70;
this.loadNextPageEvent = new EventEmitter();
this._items = [];
this.cardStyles = [];
this.itemsHolderStyle = {};
this.loadedPages = 0;
this.hidePartialRows = false;
this.CurrentScrollPosition = {
sH: 0,
sT: 0,
cH: 0
};
this.preScrollPosition = null;
}
/**
* @param {?} value
* @return {?}
*/
set items(value) {
/** @type {?} */
let newCardStyles = value.map((d, index) => {
if (index < this.cardStyles.length) {
return this.cardStyles[index];
}
return {
opacity: "0",
overflow: "hidden"
};
});
this.cardStyles = newCardStyles;
this._items = value;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.cards.changes.subscribe(() => {
this.throttleLayout();
});
this.throttleLayout();
}
/**
* @return {?}
*/
get items() {
return this._items;
}
/**
* @param {?} event
* @return {?}
*/
onScroll(event) {
this.preScrollPosition = this.CurrentScrollPosition;
this.CurrentScrollPosition = {
sH: event.target.scrollHeight,
sT: event.target.scrollTop,
cH: event.target.clientHeight
};
if (!this.loading &&
this.isScrollDown() &&
this.isScrollExpectPercent() &&
this.currentPage * this.pageSize < this.totalCount) {
this.loadNextPageEvent.emit();
}
}
/**
* @return {?}
*/
isScrollDown() {
return this.preScrollPosition.sT < this.CurrentScrollPosition.sT;
}
/**
* @return {?}
*/
isScrollExpectPercent() {
return ((this.CurrentScrollPosition.sT + this.CurrentScrollPosition.cH) /
this.CurrentScrollPosition.sH >
this.expectScrollPercent / 100);
}
/**
* @param {?} event
* @return {?}
*/
onResize(event) {
this.throttleLayout();
}
/**
* @return {?}
*/
throttleLayout() {
clearTimeout(this.layoutTimeout);
this.layoutTimeout = setTimeout(() => {
this.layout.call(this);
}, 40);
}
/**
* @return {?}
*/
get isFirstPage() {
return this.currentPage <= 1;
}
/**
* @return {?}
*/
layout() {
/** @type {?} */
let el = this.itemsHolder.nativeElement;
/** @type {?} */
let width = el.offsetWidth;
/** @type {?} */
let items = el.querySelectorAll(".card-item");
/** @type {?} */
let items_count = items.length;
if (items_count === 0) {
el.height = 0;
return;
}
/** @type {?} */
let itemsHeight = [];
for (let i = 0; i < items_count; i++) {
itemsHeight[i] = items[i].offsetHeight;
}
/** @type {?} */
let height = Math.max.apply(null, itemsHeight);
/** @type {?} */
let itemsStyle = window.getComputedStyle(items[0]);
/** @type {?} */
let minWidthStyle = itemsStyle.minWidth;
/** @type {?} */
let maxWidthStyle = itemsStyle.maxWidth;
/** @type {?} */
let minWidth = parseInt(minWidthStyle, 10);
/** @type {?} */
let maxWidth = parseInt(maxWidthStyle, 10);
/** @type {?} */
let marginHeight = parseInt(itemsStyle.marginTop, 10) +
parseInt(itemsStyle.marginBottom, 10);
/** @type {?} */
let marginWidth = parseInt(itemsStyle.marginLeft, 10) +
parseInt(itemsStyle.marginRight, 10);
/** @type {?} */
let columns = Math.floor(width / (minWidth + marginWidth));
/** @type {?} */
let columnsToUse = Math.max(Math.min(columns, items_count), 1);
/** @type {?} */
let rows = Math.floor(items_count / columnsToUse);
/** @type {?} */
let itemWidth = Math.min(Math.floor(width / columnsToUse) - marginWidth, maxWidth);
/** @type {?} */
let itemSpacing = columnsToUse === 1 || columns > items_count
? marginWidth
: (width - marginWidth - columnsToUse * itemWidth) / (columnsToUse - 1);
if (!this.withAdmiral) {
// Fixed spacing and margin on standalone mode
itemSpacing = marginWidth;
itemWidth = minWidth;
}
/** @type {?} */
let visible = items_count;
if (this.hidePartialRows &&
this.totalItemsCount &&
items_count !== this.totalItemsCount) {
visible = rows * columnsToUse;
}
/** @type {?} */
let count = 0;
for (let i = 0; i < visible; i++) {
/** @type {?} */
let item = items[i];
/** @type {?} */
let itemStyle = window.getComputedStyle(item);
/** @type {?} */
let left = (i % columnsToUse) * (itemWidth + itemSpacing);
/** @type {?} */
let top = Math.floor(count / columnsToUse) * (height + marginHeight);
/** @type {?} */
let oldTransform = itemStyle.transform;
if (!oldTransform || oldTransform === "none") {
this.cardStyles[i] = {
transform: "translate(" + left + "px," + top + "px) scale(0)",
width: itemWidth + "px",
transition: "none",
overflow: "hidden"
};
this.throttleLayout();
}
else {
this.cardStyles[i] = {
transform: "translate(" + left + "px," + top + "px) scale(1)",
width: itemWidth + "px",
transition: null,
overflow: "hidden"
};
this.throttleLayout();
}
if (!item.classList.contains("context-selected")) {
/** @type {?} */
let itemHeight = itemsHeight[i];
if (itemStyle.display === "none" && itemHeight !== 0) {
this.cardStyles[i].display = null;
}
if (itemHeight !== 0) {
count++;
}
}
}
for (let i = visible; i < items_count; i++) {
this.cardStyles[i] = {
display: "none"
};
}
this.itemsHolderStyle = {
height: Math.ceil(count / columnsToUse) * (height + marginHeight) + "px"
};
}
/**
* @param {?} i
* @return {?}
*/
onCardEnter(i) {
this.cardStyles[i].overflow = "visible";
}
/**
* @param {?} i
* @return {?}
*/
onCardLeave(i) {
this.cardStyles[i].overflow = "hidden";
}
/**
* @param {?} index
* @param {?} item
* @return {?}
*/
trackByFn(index, item) {
return index;
}
}
GridViewComponent.decorators = [
{ type: Component, args: [{
selector: "hbr-gridview",
template: "<div class=\"grid-content\" (scroll)=\"onScroll($event)\">\n <div class=\"items\" [ngStyle]=\"itemsHolderStyle\" #itemsHolder >\n <span *ngFor=\"let item of items;let i = index; trackBy:trackByFn\" class='card-item' [ngStyle]=\"cardStyles[i]\" #cardItem\n (mouseenter)='onCardEnter(i)' (mouseleave)='onCardLeave(i)'>\n <ng-template [ngTemplateOutlet]=\"gridItemTmpl\" [ngTemplateOutletContext]=\"{item: item}\">\n </ng-template>\n </span>\n <span *ngIf=\"items.length === 0 && !loading\" class=\"content-empty\">\n {{'REPOSITORY.NO_ITEMS' | translate}}\n </span>\n </div>\n <div *ngIf=\"loading\" [ngClass]=\"{'central-block-loading': isFirstPage, 'central-block-loading-more': !isFirstPage}\">\n <span class=\"vertical-helper\"></span>\n <div class=\"spinner\"></div>\n </div>\n</div>",
encapsulation: ViewEncapsulation.None,
styles: [".grid-content{position:relative;top:36px;left:0;right:0;bottom:0;overflow:auto;max-height:65vh}.card-item{display:block;max-width:400px;min-width:300px;position:absolute;margin-right:40px;transition:width .4s,transform .4s,-webkit-transform .4s}.content-empty{text-align:center;display:block;margin-top:100px}.central-block-loading{position:absolute;z-index:10;top:0;left:0;right:0;bottom:0;text-align:center;background-color:rgba(255,255,255,.5)}.central-block-loading-more{position:relative;z-index:10;top:0;left:0;right:0;bottom:0;text-align:center;background-color:rgba(255,255,255,.5)}.vertical-helper{display:inline-block;height:100%;vertical-align:middle}.spinner{width:100px;height:100px;vertical-align:middle}"]
}] }
];
/** @nocollapse */
GridViewComponent.ctorParameters = () => [
{ type: TranslateService }
];
GridViewComponent.propDecorators = {
loading: [{ type: Input }],
totalCount: [{ type: Input }],
currentPage: [{ type: Input }],
pageSize: [{ type: Input }],
expectScrollPercent: [{ type: Input }],
withAdmiral: [{ type: Input }],
items: [{ type: Input }],
loadNextPageEvent: [{ type: Output }],
cards: [{ type: ViewChildren, args: ["cardItem",] }],
itemsHolder: [{ type: ViewChild, args: ["itemsHolder",] }],
gridItemTmpl: [{ type: ContentChild, args: [TemplateRef,] }],
onScroll: [{ type: HostListener, args: ["scroll", ["$event"],] }],
onResize: [{ type: HostListener, args: ["window:resize", ["$event"],] }]
};
if (false) {
/** @type {?} */
GridViewComponent.prototype.loading;
/** @type {?} */
GridViewComponent.prototype.totalCount;
/** @type {?} */
GridViewComponent.prototype.currentPage;
/** @type {?} */
GridViewComponent.prototype.pageSize;
/** @type {?} */
GridViewComponent.prototype.expectScrollPercent;
/** @type {?} */
GridViewComponent.prototype.withAdmiral;
/** @type {?} */
GridViewComponent.prototype.loadNextPageEvent;
/** @type {?} */
GridViewComponent.prototype.cards;
/** @type {?} */
GridViewComponent.prototype.itemsHolder;
/** @type {?} */
GridViewComponent.prototype.gridItemTmpl;
/** @type {?} */
GridViewComponent.prototype._items;
/** @type {?} */
GridViewComponent.prototype.cardStyles;
/** @type {?} */
GridViewComponent.prototype.itemsHolderStyle;
/** @type {?} */
GridViewComponent.prototype.layoutTimeout;
/** @type {?} */
GridViewComponent.prototype.querySub;
/** @type {?} */
GridViewComponent.prototype.routerSub;
/** @type {?} */
GridViewComponent.prototype.totalItemsCount;
/** @type {?} */
GridViewComponent.prototype.loadedPages;
/** @type {?} */
GridViewComponent.prototype.nextPageLink;
/** @type {?} */
GridViewComponent.prototype.hidePartialRows;
/** @type {?} */
GridViewComponent.prototype.loadPagesTimeout;
/** @type {?} */
GridViewComponent.prototype.CurrentScrollPosition;
/** @type {?} */
GridViewComponent.prototype.preScrollPosition;
/** @type {?} */
GridViewComponent.prototype.translate;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoYXJib3IvdWkvIiwic291cmNlcyI6WyJzcmMvZ3JpZHZpZXcvZ3JpZC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQVdBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJdkQ7OztBQVNBLE1BQU07Ozs7SUFtREosWUFBb0IsU0FBMkI7UUFBM0IsY0FBUyxHQUFULFNBQVMsQ0FBa0I7bUNBOUNoQixFQUFFO2lDQWlCSCxJQUFJLFlBQVksRUFBTztzQkFNckMsRUFBRTswQkFFQSxFQUFFO2dDQUNJLEVBQUU7MkJBT1osQ0FBQzsrQkFFRyxLQUFLO3FDQUdpQjtZQUN0QyxFQUFFLEVBQUUsQ0FBQztZQUNMLEVBQUUsRUFBRSxDQUFDO1lBQ0wsRUFBRSxFQUFFLENBQUM7U0FDTjtpQ0FFbUMsSUFBSTtLQUVXOzs7OztJQTVDbkQsSUFDSSxLQUFLLENBQUMsS0FBWTs7UUFDcEIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsT0FBTztnQkFDTCxPQUFPLEVBQUUsR0FBRztnQkFDWixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxh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QUNIO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJO1NBQ3pFLENBQUM7S0FDSDs7Ozs7SUFFRCxXQUFXLENBQUMsQ0FBUztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7S0FDekM7Ozs7O0lBRUQsV0FBVyxDQUFDLENBQVM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0tBQ3hDOzs7Ozs7SUFFRCxTQUFTLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDaEMsT0FBTyxLQUFLLENBQUM7S0FDZDs7O1lBOU9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsNjBCQUF5QztnQkFFekMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2FBQ3RDOzs7O1lBVFEsZ0JBQWdCOzs7c0JBY3RCLEtBQUs7eUJBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7a0NBQ0wsS0FBSzswQkFDTCxLQUFLO29CQUNMLEtBQUs7Z0NBZUwsTUFBTTtvQkFFTixZQUFZLFNBQUMsVUFBVTswQkFDdkIsU0FBUyxTQUFDLGFBQWE7MkJBQ3ZCLFlBQVksU0FBQyxXQUFXO3VCQXNDeEIsWUFBWSxTQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQzt1QkE4QmpDLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgcHJvZHVjdCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS5cbiAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIHByb2R1Y3QgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqXG4gKiBUaGlzIHByb2R1Y3QgbWF5IGluY2x1ZGUgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzXG4gKiBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIHN1YmNvbXBvbmVudCdzIGxpY2Vuc2UsIGFzIG5vdGVkIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBDb250ZW50Q2hpbGQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBUZW1wbGF0ZVJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRXZlbnRFbWl0dGVyLFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5cbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJoYnItZ3JpZHZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9ncmlkLXZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dyaWQtdmlldy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbi8qKlxuICogR3JpZCB2aWV3IGdlbmVyYWwgY29tcG9uZW50LlxuICovXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcbiAgQElucHV0KCkgdG90YWxDb3VudDogbnVtYmVyO1xuICBASW5wdXQoKSBjdXJyZW50UGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBleHBlY3RTY3JvbGxQZXJjZW50ID0gNzA7XG4gIEBJbnB1dCgpIHdpdGhBZG1pcmFsOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzZXQgaXRlbXModmFsdWU6IGFueVtdKSB7XG4gICAgbGV0IG5ld0NhcmRTdHlsZXMgPSB2YWx1ZS5tYXAoKGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLmNhcmRTdHlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcmRTdHlsZXNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3BhY2l0eTogXCIwXCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY2FyZFN0eWxlcyA9IG5ld0NhcmRTdHlsZXM7XG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBsb2FkTmV4dFBhZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oXCJjYXJkSXRlbVwiKSBjYXJkczogYW55O1xuICBAVmlld0NoaWxkKFwiaXRlbXNIb2xkZXJcIikgaXRlbXNIb2xkZXI6IGFueTtcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgZ3JpZEl0ZW1UbXBsOiBhbnk7XG5cbiAgX2l0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gIGNhcmRTdHlsZXM6IGFueSA9IFtdO1xuICBpdGVtc0hvbGRlclN0eWxlOiBhbnkgPSB7fTtcbiAgbGF5b3V0VGltZW91dDogYW55O1xuXG4gIHF1ZXJ5U3ViOiBTdWJzY3JpcHRpb247XG4gIHJvdXRlclN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIHRvdGFsSXRlbXNDb3VudDogbnVtYmVyO1xuICBsb2FkZWRQYWdlcyA9IDA7XG4gIG5leHRQYWdlTGluazogc3RyaW5nO1xuICBoaWRlUGFydGlhbFJvd3MgPSBmYWxzZTtcbiAgbG9hZFBhZ2VzVGltZW91dDogYW55O1xuXG4gIEN1cnJlbnRTY3JvbGxQb3NpdGlvbjogU2Nyb2xsUG9zaXRpb24gPSB7XG4gICAgc0g6IDAsXG4gICAgc1Q6IDAsXG4gICAgY0g6IDBcbiAgfTtcblxuICBwcmVTY3JvbGxQb3NpdGlvbjogU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNhcmRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudGhyb3R0bGVMYXlvdXQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnRocm90dGxlTGF5b3V0KCk7XG4gIH1cblxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcInNjcm9sbFwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uU2Nyb2xsKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnByZVNjcm9sbFBvc2l0aW9uID0gdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb247XG4gICAgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24gPSB7XG4gICAgICBzSDogZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCxcbiAgICAgIHNUOiBldmVudC50YXJnZXQuc2Nyb2xsVG9wLFxuICAgICAgY0g6IGV2ZW50LnRhcmdldC5jbGllbnRIZWlnaHRcbiAgICB9O1xuICAgIGlmIChcbiAgICAgICF0aGlzLmxvYWRpbmcgJiZcbiAgICAgIHRoaXMuaXNTY3JvbGxEb3duKCkgJiZcbiAgICAgIHRoaXMuaXNTY3JvbGxFeHBlY3RQZXJjZW50KCkgJiZcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplIDwgdGhpcy50b3RhbENvdW50XG4gICAgKSB7XG4gICAgICB0aGlzLmxvYWROZXh0UGFnZUV2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBpc1Njcm9sbERvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJlU2Nyb2xsUG9zaXRpb24uc1QgPCB0aGlzLkN1cnJlbnRTY3JvbGxQb3NpdGlvbi5zVDtcbiAgfVxuXG4gIGlzU2Nyb2xsRXhwZWN0UGVyY2VudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuQ3VycmVudFNjcm9sbFBvc2l0aW9uLnNUICsgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24uY0gpIC9cbiAgICAgICAgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24uc0ggPlxuICAgICAgdGhpcy5leHBlY3RTY3JvbGxQZXJjZW50IC8gMTAwXG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgb25SZXNpemUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMudGhyb3R0bGVMYXlvdXQoKTtcbiAgfVxuXG4gIHRocm90dGxlTGF5b3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxheW91dFRpbWVvdXQpO1xuICAgIHRoaXMubGF5b3V0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sYXlvdXQuY2FsbCh0aGlzKTtcbiAgICB9LCA0MCk7XG4gIH1cblxuICBnZXQgaXNGaXJzdFBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPD0gMTtcbiAgfVxuXG4gIGxheW91dCgpIHtcbiAgICBsZXQgZWwgPSB0aGlzLml0ZW1zSG9sZGVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBsZXQgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBsZXQgaXRlbXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmNhcmQtaXRlbVwiKTtcbiAgICBsZXQgaXRlbXNfY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgaWYgKGl0ZW1zX2NvdW50ID09PSAwKSB7XG4gICAgICBlbC5oZWlnaHQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpdGVtc0hlaWdodCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNfY291bnQ7IGkrKykge1xuICAgICAgaXRlbXNIZWlnaHRbaV0gPSBpdGVtc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgbGV0IGhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGl0ZW1zSGVpZ2h0KTtcbiAgICBsZXQgaXRlbXNTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGl0ZW1zWzBdKTtcblxuICAgIGxldCBtaW5XaWR0aFN0eWxlOiBzdHJpbmcgPSBpdGVtc1N0eWxlLm1pbldpZHRoO1xuICAgIGxldCBtYXhXaWR0aFN0eWxlOiBzdHJpbmcgPSBpdGVtc1N0eWxlLm1heFdpZHRoO1xuXG4gICAgbGV0IG1pbldpZHRoID0gcGFyc2VJbnQobWluV2lkdGhTdHlsZSwgMTApO1xuICAgIGxldCBtYXhXaWR0aCA9IHBhcnNlSW50KG1heFdpZHRoU3R5bGUsIDEwKTtcblxuICAgIGxldCBtYXJnaW5IZWlnaHQ6IG51bWJlciA9XG4gICAgICBwYXJzZUludChpdGVtc1N0eWxlLm1hcmdpblRvcCwgMTApICtcbiAgICAgIHBhcnNlSW50KGl0ZW1zU3R5bGUubWFyZ2luQm90dG9tLCAxMCk7XG4gICAgbGV0IG1hcmdpbldpZHRoOiBudW1iZXIgPVxuICAgICAgcGFyc2VJbnQoaXRlbXNTdHlsZS5tYXJnaW5MZWZ0LCAxMCkgK1xuICAgICAgcGFyc2VJbnQoaXRlbXNTdHlsZS5tYXJnaW5SaWdodCwgMTApO1xuXG4gICAgbGV0IGNvbHVtbnMgPSBNYXRoLmZsb29yKHdpZHRoIC8gKG1pbldpZHRoICsgbWFyZ2luV2lkdGgpKTtcblxuICAgIGxldCBjb2x1bW5zVG9Vc2UgPSBNYXRoLm1heChNYXRoLm1pbihjb2x1bW5zLCBpdGVtc19jb3VudCksIDEpO1xuICAgIGxldCByb3dzID0gTWF0aC5mbG9vcihpdGVtc19jb3VudCAvIGNvbHVtbnNUb1VzZSk7XG4gICAgbGV0IGl0ZW1XaWR0aCA9IE1hdGgubWluKFxuICAgICAgTWF0aC5mbG9vcih3aWR0aCAvIGNvbHVtbnNUb1VzZSkgLSBtYXJnaW5XaWR0aCxcbiAgICAgIG1heFdpZHRoXG4gICAgKTtcbiAgICBsZXQgaXRlbVNwYWNpbmcgPVxuICAgICAgY29sdW1uc1RvVXNlID09PSAxIHx8IGNvbHVtbnMgPiBpdGVtc19jb3VudFxuICAgICAgICA/IG1hcmdpbldpZHRoXG4gICAgICAgIDogKHdpZHRoIC0gbWFyZ2luV2lkdGggLSBjb2x1bW5zVG9Vc2UgKiBpdGVtV2lkdGgpIC8gKGNvbHVtbnNUb1VzZSAtIDEpO1xuICAgIGlmICghdGhpcy53aXRoQWRtaXJhbCkge1xuICAgICAgLy8gRml4ZWQgc3BhY2luZyBhbmQgbWFyZ2luIG9uIHN0YW5kYWxvbmUgbW9kZVxuICAgICAgaXRlbVNwYWNpbmcgPSBtYXJnaW5XaWR0aDtcbiAgICAgIGl0ZW1XaWR0aCA9IG1pbldpZHRoO1xuICAgIH1cblxuICAgIGxldCB2aXNpYmxlID0gaXRlbXNfY291bnQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaWRlUGFydGlhbFJvd3MgJiZcbiAgICAgIHRoaXMudG90YWxJdGVtc0NvdW50ICYmXG4gICAgICBpdGVtc19jb3VudCAhPT0gdGhpcy50b3RhbEl0ZW1zQ291bnRcbiAgICApIHtcbiAgICAgIHZpc2libGUgPSByb3dzICogY29sdW1uc1RvVXNlO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlOyBpKyspIHtcbiAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XG4gICAgICBsZXQgaXRlbVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoaXRlbSk7XG5cbiAgICAgIGxldCBsZWZ0ID0gKGkgJSBjb2x1bW5zVG9Vc2UpICogKGl0ZW1XaWR0aCArIGl0ZW1TcGFjaW5nKTtcbiAgICAgIGxldCB0b3AgPSBNYXRoLmZsb29yKGNvdW50IC8gY29sdW1uc1RvVXNlKSAqIChoZWlnaHQgKyBtYXJnaW5IZWlnaHQpO1xuXG4gICAgICAvLyB0cmljayB0byBzaG93IG5pY2UgYXBlYXIgYW5pbWF0aW9uLCB3aGVyZSB0aGUgaXRlbSBpcyBhbHJlYWR5IHBvc2l0aW9uZWQsXG4gICAgICAvLyBidXQgaXQgd2lsbCBwb3Agb3V0XG4gICAgICBsZXQgb2xkVHJhbnNmb3JtID0gaXRlbVN0eWxlLnRyYW5zZm9ybTtcbiAgICAgIGlmICghb2xkVHJhbnNmb3JtIHx8IG9sZFRyYW5zZm9ybSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgdGhpcy5jYXJkU3R5bGVzW2ldID0ge1xuICAgICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIgKyBsZWZ0ICsgXCJweCxcIiArIHRvcCArIFwicHgpIHNjYWxlKDApXCIsXG4gICAgICAgICAgd2lkdGg6IGl0ZW1XaWR0aCArIFwicHhcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRocm90dGxlTGF5b3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcmRTdHlsZXNbaV0gPSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIiArIGxlZnQgKyBcInB4LFwiICsgdG9wICsgXCJweCkgc2NhbGUoMSlcIixcbiAgICAgICAgICB3aWR0aDogaXRlbVdpZHRoICsgXCJweFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246IG51bGwsXG4gICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50aHJvdHRsZUxheW91dCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiY29udGV4dC1zZWxlY3RlZFwiKSkge1xuICAgICAgICBsZXQgaXRlbUhlaWdodCA9IGl0ZW1zSGVpZ2h0W2ldO1xuICAgICAgICBpZiAoaXRlbVN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiICYmIGl0ZW1IZWlnaHQgIT09IDApIHtcbiAgICAgICAgICB0aGlzLmNhcmRTdHlsZXNbaV0uZGlzcGxheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW1IZWlnaHQgIT09IDApIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHZpc2libGU7IGkgPCBpdGVtc19jb3VudDsgaSsrKSB7XG4gICAgICB0aGlzLmNhcmRTdHlsZXNbaV0gPSB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLml0ZW1zSG9sZGVyU3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IE1hdGguY2VpbChjb3VudCAvIGNvbHVtbnNUb1VzZSkgKiAoaGVpZ2h0ICsgbWFyZ2luSGVpZ2h0KSArIFwicHhcIlxuICAgIH07XG4gIH1cblxuICBvbkNhcmRFbnRlcihpOiBudW1iZXIpIHtcbiAgICB0aGlzLmNhcmRTdHlsZXNbaV0ub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcbiAgfVxuXG4gIG9uQ2FyZExlYXZlKGk6IG51bWJlcikge1xuICAgIHRoaXMuY2FyZFN0eWxlc1tpXS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG4iXX0=