@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
382 lines • 51 kB
JavaScript
var IgxTextHighlightDirective_1;
import { __decorate, __metadata } from "tslib";
import { AfterViewInit, Directive, ElementRef, EventEmitter, Input, NgModule, OnChanges, OnDestroy, Renderer2, SimpleChanges, AfterViewChecked, } from '@angular/core';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { DeprecateProperty } from '../../core/deprecateDecorators';
let IgxTextHighlightDirective = IgxTextHighlightDirective_1 = class IgxTextHighlightDirective {
constructor(element, renderer) {
this.element = element;
this.renderer = renderer;
this._div = null;
this._observer = null;
this._nodeWasRemoved = false;
this._forceEvaluation = false;
this._activeElementIndex = -1;
this._defaultCssClass = 'igx-highlight';
this._defaultActiveCssClass = 'igx-highlight--active';
/**
* Identifies the highlight within a unique group.
* This allows it to have several different highlight groups,
* with each of them having their own active highlight.
*
* ```html
* <div
* igxTextHighlight
* [groupName]="myGroupName">
* </div>
* ```
*/
this.groupName = '';
this._value = '';
this.destroy$ = new Subject();
IgxTextHighlightDirective_1.onActiveElementChanged.pipe(takeUntil(this.destroy$)).subscribe((groupName) => {
if (this.groupName === groupName) {
if (this._activeElementIndex !== -1) {
this.deactivate();
}
this.activateIfNecessary();
}
});
}
/**
* The underlying value of the element that will be highlighted.
*
* ```typescript
* // get
* const elementValue = this.textHighlight.value;
* ```
*
* ```html
* <!--set-->
* <div
* igxTextHighlight
* [value]="newValue">
* </div>
* ```
*/
get value() {
return this._value;
}
set value(value) {
if (value === undefined || value === null) {
this._value = '';
}
else {
this._value = value;
}
}
/**
* @hidden
*/
get lastSearchInfo() {
return this._lastSearchInfo;
}
/**
* Activates the highlight at a given index.
* (if such index exists)
*/
static setActiveHighlight(groupName, highlight) {
IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, highlight);
IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName);
}
/**
* Clears any existing highlight.
*/
static clearActiveHighlight(groupName) {
IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, {
index: -1
});
IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName);
}
/**
* @hidden
*/
ngOnDestroy() {
this.clearHighlight();
if (this._observer !== null) {
this._observer.disconnect();
}
this.destroy$.next(true);
this.destroy$.complete();
}
/**
* @hidden
*/
ngOnChanges(changes) {
if (changes.value && !changes.value.firstChange) {
this._valueChanged = true;
}
else if ((changes.row !== undefined && !changes.row.firstChange) ||
(changes.column !== undefined && !changes.column.firstChange) ||
(changes.page !== undefined && !changes.page.firstChange)) {
if (this._activeElementIndex !== -1) {
this.deactivate();
}
this.activateIfNecessary();
}
}
/**
* @hidden
*/
ngAfterViewInit() {
this.parentElement = this.renderer.parentNode(this.element.nativeElement);
if (IgxTextHighlightDirective_1.highlightGroupsMap.has(this.groupName) === false) {
IgxTextHighlightDirective_1.highlightGroupsMap.set(this.groupName, {
index: -1
});
}
this._lastSearchInfo = {
searchedText: '',
content: this.value,
matchCount: 0,
caseSensitive: false,
exactMatch: false
};
this._container = this.parentElement.firstElementChild;
}
/**
* @hidden
*/
ngAfterViewChecked() {
if (this._valueChanged) {
this.highlight(this._lastSearchInfo.searchedText, this._lastSearchInfo.caseSensitive, this._lastSearchInfo.exactMatch);
this.activateIfNecessary();
this._valueChanged = false;
}
}
/**
* Clears the existing highlight and highlights the searched text.
* Returns how many times the element contains the searched text.
*/
highlight(text, caseSensitive, exactMatch) {
const caseSensitiveResolved = caseSensitive ? true : false;
const exactMatchResolved = exactMatch ? true : false;
if (this.searchNeedsEvaluation(text, caseSensitiveResolved, exactMatchResolved)) {
this._lastSearchInfo.searchedText = text;
this._lastSearchInfo.caseSensitive = caseSensitiveResolved;
this._lastSearchInfo.exactMatch = exactMatchResolved;
this._lastSearchInfo.content = this.value;
if (text === '' || text === undefined || text === null) {
this.clearHighlight();
}
else {
this.clearChildElements(true);
this._lastSearchInfo.matchCount = this.getHighlightedText(text, caseSensitive, exactMatch);
}
}
else if (this._nodeWasRemoved) {
this._lastSearchInfo.searchedText = text;
this._lastSearchInfo.caseSensitive = caseSensitiveResolved;
this._lastSearchInfo.exactMatch = exactMatchResolved;
}
return this._lastSearchInfo.matchCount;
}
/**
* Clears any existing highlight.
*/
clearHighlight() {
this.clearChildElements(false);
this._lastSearchInfo.searchedText = '';
this._lastSearchInfo.matchCount = 0;
}
/**
* Activates the highlight if it is on the currently active row, column and page.
*/
activateIfNecessary() {
const group = IgxTextHighlightDirective_1.highlightGroupsMap.get(this.groupName);
const column = group.columnIndex === undefined ? group.column : group.columnIndex;
const row = group.rowIndex === undefined ? group.row : group.rowIndex;
if (column === this.column && row === this.row && group.page === this.page) {
this.activate(group.index);
}
}
/**
* Attaches a MutationObserver to the parentElement and watches for when the container element is removed/readded to the DOM.
* Should be used only when necessary as using many observers may lead to performance degradation.
*/
observe() {
if (this._observer === null) {
const callback = (mutationList) => {
mutationList.forEach((mutation) => {
const removedNodes = Array.from(mutation.removedNodes);
removedNodes.forEach((n) => {
if (n === this._container) {
this._nodeWasRemoved = true;
this.clearChildElements(false);
}
});
const addedNodes = Array.from(mutation.addedNodes);
addedNodes.forEach((n) => {
if (n === this.parentElement.firstElementChild && this._nodeWasRemoved) {
this._container = this.parentElement.firstElementChild;
this._nodeWasRemoved = false;
this._forceEvaluation = true;
this.highlight(this._lastSearchInfo.searchedText, this._lastSearchInfo.caseSensitive, this._lastSearchInfo.exactMatch);
this._forceEvaluation = false;
this.activateIfNecessary();
this._observer.disconnect();
this._observer = null;
}
});
});
};
this._observer = new MutationObserver(callback);
this._observer.observe(this.parentElement, { childList: true });
}
}
activate(index) {
this.deactivate();
if (this._div !== null) {
const spans = this._div.querySelectorAll('span');
this._activeElementIndex = index;
if (spans.length <= index) {
return;
}
const elementToActivate = spans[index];
this.renderer.addClass(elementToActivate, this._defaultActiveCssClass);
this.renderer.addClass(elementToActivate, this.activeCssClass);
}
}
deactivate() {
if (this._activeElementIndex === -1) {
return;
}
const spans = this._div.querySelectorAll('span');
if (spans.length <= this._activeElementIndex) {
this._activeElementIndex = -1;
return;
}
const elementToDeactivate = spans[this._activeElementIndex];
this.renderer.removeClass(elementToDeactivate, this._defaultActiveCssClass);
this.renderer.removeClass(elementToDeactivate, this.activeCssClass);
this._activeElementIndex = -1;
}
clearChildElements(originalContentHidden) {
this.renderer.setProperty(this.element.nativeElement, 'hidden', originalContentHidden);
if (this._div !== null) {
this.renderer.removeChild(this.parentElement, this._div);
this._div = null;
this._activeElementIndex = -1;
}
}
getHighlightedText(searchText, caseSensitive, exactMatch) {
this.appendDiv();
const stringValue = String(this.value);
const contentStringResolved = !caseSensitive ? stringValue.toLowerCase() : stringValue;
const searchTextResolved = !caseSensitive ? searchText.toLowerCase() : searchText;
let matchCount = 0;
if (exactMatch) {
if (contentStringResolved === searchTextResolved) {
// tslint:disable-next-line:max-line-length
this.appendSpan(`<span class="${this._defaultCssClass} ${this.cssClass ? this.cssClass : ''}">${stringValue}</span>`);
matchCount++;
}
else {
this.appendText(stringValue);
}
}
else {
let foundIndex = contentStringResolved.indexOf(searchTextResolved, 0);
let previousMatchEnd = 0;
while (foundIndex !== -1) {
const start = foundIndex;
const end = foundIndex + searchTextResolved.length;
this.appendText(stringValue.substring(previousMatchEnd, start));
// tslint:disable-next-line:max-line-length
this.appendSpan(`<span class="${this._defaultCssClass} ${this.cssClass ? this.cssClass : ''}">${stringValue.substring(start, end)}</span>`);
previousMatchEnd = end;
matchCount++;
foundIndex = contentStringResolved.indexOf(searchTextResolved, end);
}
this.appendText(stringValue.substring(previousMatchEnd, stringValue.length));
}
return matchCount;
}
appendText(text) {
const textElement = this.renderer.createText(text);
this.renderer.appendChild(this._div, textElement);
}
appendSpan(outerHTML) {
const span = this.renderer.createElement('span');
this.renderer.appendChild(this._div, span);
this.renderer.setProperty(span, 'outerHTML', outerHTML);
}
appendDiv() {
this._div = this.renderer.createElement('div');
if (this.containerClass) {
this.renderer.addClass(this._div, this.containerClass);
}
this.renderer.appendChild(this.parentElement, this._div);
}
searchNeedsEvaluation(text, caseSensitive, exactMatch) {
const searchedText = this._lastSearchInfo.searchedText;
return !this._nodeWasRemoved &&
(searchedText === null ||
searchedText !== text ||
this._lastSearchInfo.content !== this.value ||
this._lastSearchInfo.caseSensitive !== caseSensitive ||
this._lastSearchInfo.exactMatch !== exactMatch ||
this._forceEvaluation);
}
};
IgxTextHighlightDirective.onActiveElementChanged = new EventEmitter();
IgxTextHighlightDirective.highlightGroupsMap = new Map();
IgxTextHighlightDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
__decorate([
Input('cssClass'),
__metadata("design:type", String)
], IgxTextHighlightDirective.prototype, "cssClass", void 0);
__decorate([
Input('activeCssClass'),
__metadata("design:type", String)
], IgxTextHighlightDirective.prototype, "activeCssClass", void 0);
__decorate([
Input('containerClass'),
__metadata("design:type", String)
], IgxTextHighlightDirective.prototype, "containerClass", void 0);
__decorate([
Input('groupName'),
__metadata("design:type", Object)
], IgxTextHighlightDirective.prototype, "groupName", void 0);
__decorate([
Input('value'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxTextHighlightDirective.prototype, "value", null);
__decorate([
Input('row'),
__metadata("design:type", Object)
], IgxTextHighlightDirective.prototype, "row", void 0);
__decorate([
Input('column'),
__metadata("design:type", Object)
], IgxTextHighlightDirective.prototype, "column", void 0);
__decorate([
Input('page'),
DeprecateProperty(`IgxTextHighlightDirective 'page' input property is deprecated.`),
__metadata("design:type", Number)
], IgxTextHighlightDirective.prototype, "page", void 0);
IgxTextHighlightDirective = IgxTextHighlightDirective_1 = __decorate([
Directive({
selector: '[igxTextHighlight]'
}),
__metadata("design:paramtypes", [ElementRef, Renderer2])
], IgxTextHighlightDirective);
export { IgxTextHighlightDirective };
/**
* @hidden
*/
let IgxTextHighlightModule = class IgxTextHighlightModule {
};
IgxTextHighlightModule = __decorate([
NgModule({
declarations: [IgxTextHighlightDirective],
exports: [IgxTextHighlightDirective]
})
], IgxTextHighlightModule);
export { IgxTextHighlightModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDSCxhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBMkNuRSxJQUFhLHlCQUF5QixpQ0FBdEMsTUFBYSx5QkFBeUI7SUE4SmxDLFlBQW9CLE9BQW1CLEVBQVMsUUFBbUI7UUFBL0MsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVc7UUF6SjNELFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixjQUFTLEdBQXFCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFekIscUJBQWdCLEdBQUcsZUFBZSxDQUFDO1FBQ25DLDJCQUFzQixHQUFHLHVCQUF1QixDQUFDO1FBb0N6RDs7Ozs7Ozs7Ozs7V0FXRztRQUVJLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZCxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBMEVaLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBc0J0QywyQkFBeUIsQ0FB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QUFDO0dBQ1csc0JBQXNCLENBQUk7U0FBMUIsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIEFmdGVyVmlld0NoZWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVwcmVjYXRlUHJvcGVydHkgfSBmcm9tICcuLi8uLi9jb3JlL2RlcHJlY2F0ZURlY29yYXRvcnMnO1xuXG5pbnRlcmZhY2UgSVNlYXJjaEluZm8ge1xuICAgIHNlYXJjaGVkVGV4dDogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBtYXRjaENvdW50OiBudW1iZXI7XG4gICAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcbiAgICBleGFjdE1hdGNoOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBkZXNjcmliaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZlIGhpZ2hsaWdodC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlSGlnaGxpZ2h0SW5mbyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSBgcm93YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJvd0luZGV4PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGhpZ2hsaWdodC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB1c2UgYGNvbHVtbmAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjb2x1bW5JbmRleD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuXG4gICAgICovXG4gICAgcGFnZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgcm93PzogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gb2YgdGhlIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBjb2x1bW4/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGV4dEhpZ2hsaWdodF0nXG59KVxuZXhwb3J0IGNsYXNzIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgb25BY3RpdmVFbGVtZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBzdGF0aWMgaGlnaGxpZ2h0R3JvdXBzTWFwID0gbmV3IE1hcDxzdHJpbmcsIElBY3RpdmVIaWdobGlnaHRJbmZvPigpO1xuXG4gICAgcHJpdmF0ZSBfbGFzdFNlYXJjaEluZm86IElTZWFyY2hJbmZvO1xuICAgIHByaXZhdGUgX2RpdiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHByaXZhdGUgX25vZGVXYXNSZW1vdmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZm9yY2VFdmFsdWF0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2RlZmF1bHRDc3NDbGFzcyA9ICdpZ3gtaGlnaGxpZ2h0JztcbiAgICBwcml2YXRlIF9kZWZhdWx0QWN0aXZlQ3NzQ2xhc3MgPSAnaWd4LWhpZ2hsaWdodC0tYWN0aXZlJztcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGBDU1NgIGNsYXNzIG9mIHRoZSBoaWdobGlnaHQgZWxlbWVudHMuXG4gICAgICogVGhpcyBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBwcm92aWRlIGN1c3RvbSBgQ1NTYCB0byBjdXN0b21pemUgdGhlIGhpZ2hsaWdodC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY3NzQ2xhc3NdPVwibXlDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnY3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBjc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYENTU2AgY2xhc3Mgb2YgdGhlIGFjdGl2ZSBoaWdobGlnaHQgZWxlbWVudC5cbiAgICAgKiBUaGlzIGFsbG93cyB0aGUgZGV2ZWxvcGVyIHRvIHByb3ZpZGUgY3VzdG9tIGBDU1NgIHRvIGN1c3RvbWl6ZSB0aGUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFthY3RpdmVDc3NDbGFzc109XCJhY3RpdmVIaWdobGlnaHRDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnYWN0aXZlQ3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBhY3RpdmVDc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgnY29udGFpbmVyQ2xhc3MnKVxuICAgIHB1YmxpYyBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcyB0aGUgaGlnaGxpZ2h0IHdpdGhpbiBhIHVuaXF1ZSBncm91cC5cbiAgICAgKiBUaGlzIGFsbG93cyBpdCB0byBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGhpZ2hsaWdodCBncm91cHMsXG4gICAgICogd2l0aCBlYWNoIG9mIHRoZW0gaGF2aW5nIHRoZWlyIG93biBhY3RpdmUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFtncm91cE5hbWVdPVwibXlHcm91cE5hbWVcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2dyb3VwTmFtZScpXG4gICAgcHVibGljIGdyb3VwTmFtZSA9ICcnO1xuXG4gICAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBoaWdobGlnaHRlZC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBjb25zdCBlbGVtZW50VmFsdWUgPSB0aGlzLnRleHRIaWdobGlnaHQudmFsdWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFt2YWx1ZV09XCJuZXdWYWx1ZVwiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgndmFsdWUnKVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJvdyBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbcm93XT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3JvdycpXG4gICAgcHVibGljIHJvdzogYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbHVtbiBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY29sdW1uXT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2NvbHVtbicpXG4gICAgcHVibGljIGNvbHVtbjogYW55O1xuXG4gICAgQElucHV0KCdwYWdlJylcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgJ3BhZ2UnIGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuYClcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdFNlYXJjaEluZm8oKTogSVNlYXJjaEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJlbnRFbGVtZW50OiBhbnk7XG5cbiAgICBwcml2YXRlIF9jb250YWluZXI6IGFueTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgYXQgYSBnaXZlbiBpbmRleC5cbiAgICAgKiAoaWYgc3VjaCBpbmRleCBleGlzdHMpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRBY3RpdmVIaWdobGlnaHQoZ3JvdXBOYW1lOiBzdHJpbmcsIGhpZ2hsaWdodDogSUFjdGl2ZUhpZ2hsaWdodEluZm8pIHtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KGdyb3VwTmFtZSwgaGlnaGxpZ2h0KTtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5vbkFjdGl2ZUVsZW1lbnRDaGFuZ2VkLmVtaXQoZ3JvdXBOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWN0aXZlSGlnaGxpZ2h0KGdyb3VwTmFtZSkge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICBpbmRleDogLTFcbiAgICAgICAgfSk7XG4gICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUub25BY3RpdmVFbGVtZW50Q2hhbmdlZC5lbWl0KGdyb3VwTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLm9uQWN0aXZlRWxlbWVudENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZ3JvdXBOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cE5hbWUgPT09IGdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlSWZOZWNlc3NhcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29ic2VydmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUgJiYgIWNoYW5nZXMudmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNoYW5nZXMucm93ICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMucm93LmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMuY29sdW1uLmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMucGFnZSAhPT0gdW5kZWZpbmVkICYmICFjaGFuZ2VzLnBhZ2UuZmlyc3RDaGFuZ2UpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5oYXModGhpcy5ncm91cE5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KHRoaXMuZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgc2VhcmNoZWRUZXh0OiAnJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZXhpc3RpbmcgaGlnaGxpZ2h0IGFuZCBoaWdobGlnaHRzIHRoZSBzZWFyY2hlZCB0ZXh0LlxuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIHNlYXJjaGVkIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGhpZ2hsaWdodCh0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoTmVlZHNFdmFsdWF0aW9uKHRleHQsIGNhc2VTZW5zaXRpdmVSZXNvbHZlZCwgZXhhY3RNYXRjaFJlc29sdmVkKSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoZWRUZXh0ID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQ7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoID0gZXhhY3RNYXRjaFJlc29sdmVkO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY29udGVudCA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnJyB8fCB0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNoaWxkRWxlbWVudHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IHRoaXMuZ2V0SGlnaGxpZ2h0ZWRUZXh0KHRleHQsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vZGVXYXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmVSZXNvbHZlZDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggPSBleGFjdE1hdGNoUmVzb2x2ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgaWYgaXQgaXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgcm93LCBjb2x1bW4gYW5kIHBhZ2UuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlSWZOZWNlc3NhcnkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuZ3JvdXBOYW1lKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZ3JvdXAuY29sdW1uSW5kZXggPT09IHVuZGVmaW5lZCA/IGdyb3VwLmNvbHVtbiA6IGdyb3VwLmNvbHVtbkluZGV4O1xuICAgICAgICBjb25zdCByb3cgPSBncm91cC5yb3dJbmRleCA9PT0gdW5kZWZpbmVkID8gZ3JvdXAucm93IDogZ3JvdXAucm93SW5kZXg7XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGhpcy5jb2x1bW4gJiYgcm93ID09PSB0aGlzLnJvdyAmJiBncm91cC5wYWdlID09PSB0aGlzLnBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoZ3JvdXAuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBNdXRhdGlvbk9ic2VydmVyIHRvIHRoZSBwYXJlbnRFbGVtZW50IGFuZCB3YXRjaGVzIGZvciB3aGVuIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyByZW1vdmVkL3JlYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5IGFzIHVzaW5nIG1hbnkgb2JzZXJ2ZXJzIG1heSBsZWFkIHRvIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvYnNlcnZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PT0gdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm9kZVdhc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkTm9kZXMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCAmJiB0aGlzLl9ub2RlV2FzUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlV2FzUmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VFdmFsdWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlRXZhbHVhdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RpdiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb0FjdGl2YXRlID0gc3BhbnNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50VG9BY3RpdmF0ZSwgdGhpcy5fZGVmYXVsdEFjdGl2ZUNzc0NsYXNzKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudFRvQWN0aXZhdGUsIHRoaXMuYWN0aXZlQ3NzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXG4gICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0RlYWN0aXZhdGUgPSBzcGFuc1t0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXhdO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRUb0RlYWN0aXZhdGUsIHRoaXMuX2RlZmF1bHRBY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWxlbWVudFRvRGVhY3RpdmF0ZSwgdGhpcy5hY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJDaGlsZEVsZW1lbnRzKG9yaWdpbmFsQ29udGVudEhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnaGlkZGVuJywgb3JpZ2luYWxDb250ZW50SGlkZGVuKTtcblxuICAgICAgICBpZiAodGhpcy5fZGl2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5fZGl2KTtcblxuICAgICAgICAgICAgdGhpcy5fZGl2ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIaWdobGlnaHRlZFRleHQoc2VhcmNoVGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBleGFjdE1hdGNoOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRGl2KCk7XG5cbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRTdHJpbmdSZXNvbHZlZCA9ICFjYXNlU2Vuc2l0aXZlID8gc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0UmVzb2x2ZWQgPSAhY2FzZVNlbnNpdGl2ZSA/IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRleHQ7XG5cbiAgICAgICAgbGV0IG1hdGNoQ291bnQgPSAwO1xuXG4gICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICBpZiAoY29udGVudFN0cmluZ1Jlc29sdmVkID09PSBzZWFyY2hUZXh0UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRTcGFuKGA8c3BhbiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENzc0NsYXNzfSAke3RoaXMuY3NzQ2xhc3MgPyB0aGlzLmNzc0NsYXNzIDogJyd9XCI+JHtzdHJpbmdWYWx1ZX08L3NwYW4+YCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZvdW5kSW5kZXggPSBjb250ZW50U3RyaW5nUmVzb2x2ZWQuaW5kZXhPZihzZWFyY2hUZXh0UmVzb2x2ZWQsIDApO1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzTWF0Y2hFbmQgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoZm91bmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGZvdW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gZm91bmRJbmRleCArIHNlYXJjaFRleHRSZXNvbHZlZC5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUuc3Vic3RyaW5nKHByZXZpb3VzTWF0Y2hFbmQsIHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kU3BhbihgPHNwYW4gY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDc3NDbGFzc30gJHt0aGlzLmNzc0NsYXNzID8gdGhpcy5jc3NDbGFzcyA6ICcnfVwiPiR7c3RyaW5nVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzTWF0Y2hFbmQgPSBlbmQ7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgZm91bmRJbmRleCA9IGNvbnRlbnRTdHJpbmdSZXNvbHZlZC5pbmRleE9mKHNlYXJjaFRleHRSZXNvbHZlZCwgZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hcHBlbmRUZXh0KHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhwcmV2aW91c01hdGNoRW5kLCBzdHJpbmdWYWx1ZS5sZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaENvdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQodGV4dCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRTcGFuKG91dGVySFRNTDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9kaXYsIHNwYW4pO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHNwYW4sICdvdXRlckhUTUwnLCBvdXRlckhUTUwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kRGl2KCkge1xuICAgICAgICB0aGlzLl9kaXYgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpZiAoIHRoaXMuY29udGFpbmVyQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZGl2LCB0aGlzLmNvbnRhaW5lckNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5