UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

804 lines • 61.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, EventEmitter, Input, NgModule, Renderer2 } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { DeprecateProperty } from '../../core/deprecateDecorators'; /** * @record */ function ISearchInfo() { } if (false) { /** @type {?} */ ISearchInfo.prototype.searchedText; /** @type {?} */ ISearchInfo.prototype.content; /** @type {?} */ ISearchInfo.prototype.matchCount; /** @type {?} */ ISearchInfo.prototype.caseSensitive; /** @type {?} */ ISearchInfo.prototype.exactMatch; } /** * An interface describing information for the active highlight. * @record */ export function IActiveHighlightInfo() { } if (false) { /** * The row index of the highlight. This property is deprecated, use `row` instead. * @type {?|undefined} */ IActiveHighlightInfo.prototype.rowIndex; /** * The column index of the highlight. This property is deprecated, use `column` instead. * @type {?|undefined} */ IActiveHighlightInfo.prototype.columnIndex; /** * The page index of the highlight. This property is deprecated. * @type {?|undefined} */ IActiveHighlightInfo.prototype.page; /** * The row of the highlight. * @type {?|undefined} */ IActiveHighlightInfo.prototype.row; /** * The column of the highlight. * @type {?|undefined} */ IActiveHighlightInfo.prototype.column; /** * The index of the highlight. * @type {?} */ IActiveHighlightInfo.prototype.index; } var IgxTextHighlightDirective = /** @class */ (function () { function IgxTextHighlightDirective(element, renderer) { var _this = this; this.element = element; this.renderer = renderer; this._div = null; this._observer = null; this._nodeWasRemoved = false; this._forceEvaluation = false; this._activeElementIndex = -1; /** * 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.onActiveElementChanged.pipe(takeUntil(this.destroy$)).subscribe(function (groupName) { if (_this.groupName === groupName) { if (_this._activeElementIndex !== -1) { _this.deactivate(); } _this.activateIfNecessary(); } }); } Object.defineProperty(IgxTextHighlightDirective.prototype, "value", { /** * 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: /** * The underlying value of the element that will be highlighted. * * ```typescript * // get * const elementValue = this.textHighlight.value; * ``` * * ```html * <!--set--> * <div * igxTextHighlight * [value]="newValue"> * </div> * ``` * @return {?} */ function () { return this._value; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value === undefined || value === null) { this._value = ''; } else { this._value = value; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxTextHighlightDirective.prototype, "lastSearchInfo", { /** * @hidden */ get: /** * @hidden * @return {?} */ function () { return this._lastSearchInfo; }, enumerable: true, configurable: true }); /** * Activates the highlight at a given index. * (if such index exists) */ /** * Activates the highlight at a given index. * (if such index exists) * @param {?} groupName * @param {?} highlight * @return {?} */ IgxTextHighlightDirective.setActiveHighlight = /** * Activates the highlight at a given index. * (if such index exists) * @param {?} groupName * @param {?} highlight * @return {?} */ function (groupName, highlight) { IgxTextHighlightDirective.highlightGroupsMap.set(groupName, highlight); IgxTextHighlightDirective.onActiveElementChanged.emit(groupName); }; /** * Clears any existing highlight. */ /** * Clears any existing highlight. * @param {?} groupName * @return {?} */ IgxTextHighlightDirective.clearActiveHighlight = /** * Clears any existing highlight. * @param {?} groupName * @return {?} */ function (groupName) { IgxTextHighlightDirective.highlightGroupsMap.set(groupName, { index: -1 }); IgxTextHighlightDirective.onActiveElementChanged.emit(groupName); }; /** * @hidden */ /** * @hidden * @return {?} */ IgxTextHighlightDirective.prototype.ngOnDestroy = /** * @hidden * @return {?} */ function () { this.clearHighlight(); if (this._observer !== null) { this._observer.disconnect(); } this.destroy$.next(true); this.destroy$.complete(); }; /** * @hidden */ /** * @hidden * @param {?} changes * @return {?} */ IgxTextHighlightDirective.prototype.ngOnChanges = /** * @hidden * @param {?} changes * @return {?} */ function (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 */ /** * @hidden * @return {?} */ IgxTextHighlightDirective.prototype.ngAfterViewInit = /** * @hidden * @return {?} */ function () { this.parentElement = this.renderer.parentNode(this.element.nativeElement); if (IgxTextHighlightDirective.highlightGroupsMap.has(this.groupName) === false) { IgxTextHighlightDirective.highlightGroupsMap.set(this.groupName, { index: -1 }); } this._lastSearchInfo = { searchedText: '', content: this.value, matchCount: 0, caseSensitive: false, exactMatch: false }; this._container = this.parentElement.firstElementChild; }; /** * @hidden */ /** * @hidden * @return {?} */ IgxTextHighlightDirective.prototype.ngAfterViewChecked = /** * @hidden * @return {?} */ function () { 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. */ /** * Clears the existing highlight and highlights the searched text. * Returns how many times the element contains the searched text. * @param {?} text * @param {?=} caseSensitive * @param {?=} exactMatch * @return {?} */ IgxTextHighlightDirective.prototype.highlight = /** * Clears the existing highlight and highlights the searched text. * Returns how many times the element contains the searched text. * @param {?} text * @param {?=} caseSensitive * @param {?=} exactMatch * @return {?} */ function (text, caseSensitive, exactMatch) { /** @type {?} */ var caseSensitiveResolved = caseSensitive ? true : false; /** @type {?} */ var 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. */ /** * Clears any existing highlight. * @return {?} */ IgxTextHighlightDirective.prototype.clearHighlight = /** * Clears any existing highlight. * @return {?} */ function () { this.clearChildElements(false); this._lastSearchInfo.searchedText = ''; this._lastSearchInfo.matchCount = 0; }; /** * Activates the highlight if it is on the currently active row, column and page. */ /** * Activates the highlight if it is on the currently active row, column and page. * @return {?} */ IgxTextHighlightDirective.prototype.activateIfNecessary = /** * Activates the highlight if it is on the currently active row, column and page. * @return {?} */ function () { /** @type {?} */ var group = IgxTextHighlightDirective.highlightGroupsMap.get(this.groupName); /** @type {?} */ var column = group.columnIndex === undefined ? group.column : group.columnIndex; /** @type {?} */ var 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. */ /** * 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. * @return {?} */ IgxTextHighlightDirective.prototype.observe = /** * 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. * @return {?} */ function () { var _this = this; if (this._observer === null) { /** @type {?} */ var callback = function (mutationList) { mutationList.forEach(function (mutation) { /** @type {?} */ var removedNodes = Array.from(mutation.removedNodes); removedNodes.forEach(function (n) { if (n === _this._container) { _this._nodeWasRemoved = true; _this.clearChildElements(false); } }); /** @type {?} */ var addedNodes = Array.from(mutation.addedNodes); addedNodes.forEach(function (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 }); } }; /** * @private * @param {?} index * @return {?} */ IgxTextHighlightDirective.prototype.activate = /** * @private * @param {?} index * @return {?} */ function (index) { this.deactivate(); if (this._div !== null) { /** @type {?} */ var spans = this._div.querySelectorAll('span'); this._activeElementIndex = index; if (spans.length <= index) { return; } /** @type {?} */ var elementToActivate = spans[index]; this.renderer.addClass(elementToActivate, this.activeCssClass); this.renderer.setAttribute(elementToActivate, 'style', 'background:orange;color:black'); } }; /** * @private * @return {?} */ IgxTextHighlightDirective.prototype.deactivate = /** * @private * @return {?} */ function () { if (this._activeElementIndex === -1) { return; } /** @type {?} */ var spans = this._div.querySelectorAll('span'); if (spans.length <= this._activeElementIndex) { this._activeElementIndex = -1; return; } /** @type {?} */ var elementToDeactivate = spans[this._activeElementIndex]; this.renderer.removeClass(elementToDeactivate, this.activeCssClass); this.renderer.setAttribute(elementToDeactivate, 'style', 'background:yellow;color:black'); this._activeElementIndex = -1; }; /** * @private * @param {?} originalContentHidden * @return {?} */ IgxTextHighlightDirective.prototype.clearChildElements = /** * @private * @param {?} originalContentHidden * @return {?} */ function (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; } }; /** * @private * @param {?} searchText * @param {?} caseSensitive * @param {?} exactMatch * @return {?} */ IgxTextHighlightDirective.prototype.getHighlightedText = /** * @private * @param {?} searchText * @param {?} caseSensitive * @param {?} exactMatch * @return {?} */ function (searchText, caseSensitive, exactMatch) { this.appendDiv(); /** @type {?} */ var stringValue = String(this.value); /** @type {?} */ var contentStringResolved = !caseSensitive ? stringValue.toLowerCase() : stringValue; /** @type {?} */ var searchTextResolved = !caseSensitive ? searchText.toLowerCase() : searchText; /** @type {?} */ var matchCount = 0; if (exactMatch) { if (contentStringResolved === searchTextResolved) { // tslint:disable-next-line:max-line-length this.appendSpan("<span class=\"" + this.cssClass + "\" style=\"background:yellow;color:black\">" + stringValue + "</span>"); matchCount++; } else { this.appendText(stringValue); } } else { /** @type {?} */ var foundIndex = contentStringResolved.indexOf(searchTextResolved, 0); /** @type {?} */ var previousMatchEnd = 0; while (foundIndex !== -1) { /** @type {?} */ var start = foundIndex; /** @type {?} */ var end = foundIndex + searchTextResolved.length; this.appendText(stringValue.substring(previousMatchEnd, start)); // tslint:disable-next-line:max-line-length this.appendSpan("<span class=\"" + this.cssClass + "\" style=\"background:yellow;color:black\">" + stringValue.substring(start, end) + "</span>"); previousMatchEnd = end; matchCount++; foundIndex = contentStringResolved.indexOf(searchTextResolved, end); } this.appendText(stringValue.substring(previousMatchEnd, stringValue.length)); } return matchCount; }; /** * @private * @param {?} text * @return {?} */ IgxTextHighlightDirective.prototype.appendText = /** * @private * @param {?} text * @return {?} */ function (text) { /** @type {?} */ var textElement = this.renderer.createText(text); this.renderer.appendChild(this._div, textElement); }; /** * @private * @param {?} outerHTML * @return {?} */ IgxTextHighlightDirective.prototype.appendSpan = /** * @private * @param {?} outerHTML * @return {?} */ function (outerHTML) { /** @type {?} */ var span = this.renderer.createElement('span'); this.renderer.appendChild(this._div, span); this.renderer.setProperty(span, 'outerHTML', outerHTML); }; /** * @private * @return {?} */ IgxTextHighlightDirective.prototype.appendDiv = /** * @private * @return {?} */ function () { this._div = this.renderer.createElement('div'); if (this.containerClass) { this.renderer.addClass(this._div, this.containerClass); } this.renderer.appendChild(this.parentElement, this._div); }; /** * @private * @param {?} text * @param {?} caseSensitive * @param {?} exactMatch * @return {?} */ IgxTextHighlightDirective.prototype.searchNeedsEvaluation = /** * @private * @param {?} text * @param {?} caseSensitive * @param {?} exactMatch * @return {?} */ function (text, caseSensitive, exactMatch) { /** @type {?} */ var 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.decorators = [ { type: Directive, args: [{ selector: '[igxTextHighlight]' },] } ]; /** @nocollapse */ IgxTextHighlightDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 } ]; }; IgxTextHighlightDirective.propDecorators = { cssClass: [{ type: Input, args: ['cssClass',] }], activeCssClass: [{ type: Input, args: ['activeCssClass',] }], containerClass: [{ type: Input, args: ['containerClass',] }], groupName: [{ type: Input, args: ['groupName',] }], value: [{ type: Input, args: ['value',] }], row: [{ type: Input, args: ['row',] }], column: [{ type: Input, args: ['column',] }], page: [{ type: Input, args: ['page',] }] }; tslib_1.__decorate([ DeprecateProperty("IgxTextHighlightDirective 'page' input property is deprecated."), tslib_1.__metadata("design:type", Number) ], IgxTextHighlightDirective.prototype, "page", void 0); return IgxTextHighlightDirective; }()); export { IgxTextHighlightDirective }; if (false) { /** * @type {?} * @private */ IgxTextHighlightDirective.onActiveElementChanged; /** @type {?} */ IgxTextHighlightDirective.highlightGroupsMap; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._lastSearchInfo; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._div; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._observer; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._nodeWasRemoved; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._forceEvaluation; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._activeElementIndex; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._valueChanged; /** * Determines the `CSS` class of the highlight elements. * This allows the developer to provide custom `CSS` to customize the highlight. * * ```html * <div * igxTextHighlight * [cssClass]="myClass"> * </div> * ``` * @type {?} */ IgxTextHighlightDirective.prototype.cssClass; /** * Determines the `CSS` class of the active highlight element. * This allows the developer to provide custom `CSS` to customize the highlight. * * ```html * <div * igxTextHighlight * [activeCssClass]="activeHighlightClass"> * </div> * ``` * @type {?} */ IgxTextHighlightDirective.prototype.activeCssClass; /** * @hidden * @type {?} */ IgxTextHighlightDirective.prototype.containerClass; /** * 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> * ``` * @type {?} */ IgxTextHighlightDirective.prototype.groupName; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._value; /** * The identifier of the row on which the directive is currently on. * * ```html * <div * igxTextHighlight * [row]="0"> * </div> * ``` * @type {?} */ IgxTextHighlightDirective.prototype.row; /** * The identifier of the column on which the directive is currently on. * * ```html * <div * igxTextHighlight * [column]="0"> * </div> * ``` * @type {?} */ IgxTextHighlightDirective.prototype.column; /** @type {?} */ IgxTextHighlightDirective.prototype.page; /** * @hidden * @type {?} */ IgxTextHighlightDirective.prototype.parentElement; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype._container; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype.destroy$; /** * @type {?} * @private */ IgxTextHighlightDirective.prototype.element; /** @type {?} */ IgxTextHighlightDirective.prototype.renderer; } /** * @hidden */ var IgxTextHighlightModule = /** @class */ (function () { function IgxTextHighlightModule() { } IgxTextHighlightModule.decorators = [ { type: NgModule, args: [{ declarations: [IgxTextHighlightDirective], exports: [IgxTextHighlightDirective] },] } ]; return IgxTextHighlightModule; }()); export { IgxTextHighlightModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUdSLFNBQVMsRUFHWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7OztBQUVuRSwwQkFNQzs7O0lBTEcsbUNBQXFCOztJQUNyQiw4QkFBZ0I7O0lBQ2hCLGlDQUFtQjs7SUFDbkIsb0NBQXVCOztJQUN2QixpQ0FBb0I7Ozs7OztBQU14QiwwQ0F5QkM7Ozs7OztJQXJCRyx3Q0FBa0I7Ozs7O0lBSWxCLDJDQUFxQjs7Ozs7SUFJckIsb0NBQWM7Ozs7O0lBSWQsbUNBQVU7Ozs7O0lBSVYsc0NBQWE7Ozs7O0lBSWIscUNBQWM7O0FBR2xCO0lBK0pJLG1DQUFvQixPQUFtQixFQUFTLFFBQW1CO1FBQW5FLGlCQVNDO1FBVG1CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdkozRCxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osY0FBUyxHQUFxQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHdCQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O1FBa0QxQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWQsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQTBFWixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQXNCdEMseUJBQXlCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQyxTQUFTO1lBQ2hHLElBQUksS0FBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLElBQUksS0FBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNqQyxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ3JCO2dCQUNELEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQzlCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBdEZELHNCQUNXLDRDQUFLO1FBakJoQjs7Ozs7Ozs7Ozs7Ozs7O1dBZUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLENBQUM7Ozs7O1FBQ0QsVUFBaUIsS0FBVTtZQUN2QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDdkI7UUFDTCxDQUFDOzs7T0FQQTtJQTBDRCxzQkFBVyxxREFBYztRQUh6Qjs7V0FFRzs7Ozs7UUFDSDtZQUNJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxDQUFDOzs7T0FBQTtJQVdEOzs7T0FHRzs7Ozs7Ozs7SUFDVyw0Q0FBa0I7Ozs7Ozs7SUFBaEMsVUFBaUMsU0FBaUIsRUFBRSxTQUErQjtRQUMvRSx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNXLDhDQUFvQjs7Ozs7SUFBbEMsVUFBbUMsU0FBUztRQUN4Qyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQ3hELEtBQUssRUFBRSxDQUFDLENBQUM7U0FDWixDQUFDLENBQUM7UUFDSCx5QkFBeUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQWFEOztPQUVHOzs7OztJQUNILCtDQUFXOzs7O0lBQVg7UUFDSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNILCtDQUFXOzs7OztJQUFYLFVBQVksT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDN0I7YUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUM5RCxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDN0QsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDM0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNyQjtZQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNILG1EQUFlOzs7O0lBQWY7UUFDSSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUUsSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUM1RSx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUNaLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixZQUFZLEVBQUUsRUFBRTtZQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDbkIsVUFBVSxFQUFFLENBQUM7WUFDYixhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsS0FBSztTQUNwQixDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCxzREFBa0I7Ozs7SUFBbEI7UUFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7Ozs7O0lBQ0ksNkNBQVM7Ozs7Ozs7O0lBQWhCLFVBQWlCLElBQVksRUFBRSxhQUF1QixFQUFFLFVBQW9COztZQUNsRSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSzs7WUFDcEQsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFFcEQsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLEVBQUU7WUFDN0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDO1lBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFFMUMsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDOUY7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUM7WUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUM7U0FDeEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSSxrREFBYzs7OztJQUFyQjtRQUNJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSSx1REFBbUI7Ozs7SUFBMUI7O1lBQ1UsS0FBSyxHQUFHLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDOztZQUN4RSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXOztZQUMzRSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRO1FBRXJFLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0ksMkNBQU87Ozs7O0lBQWQ7UUFBQSxpQkFtQ0M7UUFsQ0csSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTs7Z0JBQ25CLFFBQVEsR0FBRyxVQUFDLFlBQVk7Z0JBQzFCLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFROzt3QkFDcEIsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztvQkFDdEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUM7d0JBQ25CLElBQUksQ0FBQyxLQUFLLEtBQUksQ0FBQyxVQUFVLEVBQUU7NEJBQ3ZCLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDOzRCQUM1QixLQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ2xDO29CQUNMLENBQUMsQ0FBQyxDQUFDOzt3QkFFRyxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUNsRCxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLEtBQUssS0FBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxLQUFJLENBQUMsZUFBZSxFQUFFOzRCQUNwRSxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUM7NEJBQ3ZELEtBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOzRCQUU3QixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDOzRCQUM3QixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUM1QyxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFDbEMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDckMsS0FBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs0QkFFOUIsS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7NEJBQzNCLEtBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQzVCLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3lCQUN6QjtvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sNENBQVE7Ozs7O0lBQWhCLFVBQWlCLEtBQWE7UUFDMUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7O2dCQUNkLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNoRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBRWpDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQ3ZCLE9BQU87YUFDVjs7Z0JBRUssaUJBQWlCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLCtCQUErQixDQUFDLENBQUM7U0FDM0Y7SUFDTCxDQUFDOzs7OztJQUVPLDhDQUFVOzs7O0lBQWxCO1FBQ0ksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDakMsT0FBTztTQUNWOztZQUVLLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUVoRCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QixPQUFPO1NBQ1Y7O1lBRUssbUJBQW1CLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Ozs7OztJQUVPLHNEQUFrQjs7Ozs7SUFBMUIsVUFBMkIscUJBQThCO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFekQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQzs7Ozs7Ozs7SUFFTyxzREFBa0I7Ozs7Ozs7SUFBMUIsVUFBMkIsVUFBa0IsRUFBRSxhQUFzQixFQUFFLFVBQW1CO1FBQ3RGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7WUFFWCxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O1lBQ2hDLHFCQUFxQixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVc7O1lBQ2hGLGtCQUFrQixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVU7O1lBRTdFLFVBQVUsR0FBRyxDQUFDO1FBRWxCLElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxxQkFBcUIsS0FBSyxrQkFBa0IsRUFBRTtnQkFDOUMsMkNBQTJDO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFnQixJQUFJLENBQUMsUUFBUSxtREFBMkMsV0FBVyxZQUFTLENBQUMsQ0FBQztnQkFDOUcsVUFBVSxFQUFFLENBQUM7YUFDaEI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNoQztTQUNKO2FBQU07O2dCQUNDLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDOztnQkFDakUsZ0JBQWdCLEdBQUcsQ0FBQztZQUV4QixPQUFPLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTs7b0JBQ2hCLEtBQUssR0FBRyxVQUFVOztvQkFDbEIsR0FBRyxHQUFHLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUVsRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsMkNBQTJDO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFnQixJQUFJLENBQUMsUUFBUSxtREFBMkMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFlBQVMsQ0FBQyxDQUFDO2dCQUVwSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7Z0JBQ3ZCLFVBQVUsRUFBRSxDQUFDO2dCQUViLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDdkU7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDaEY7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOzs7Ozs7SUFFTyw4Q0FBVTs7Ozs7SUFBbEIsVUFBbUIsSUFBWTs7WUFDckIsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Ozs7OztJQUVPLDhDQUFVOzs7OztJQUFsQixVQUFtQixTQUFpQjs7WUFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQzs7Ozs7SUFFTyw2Q0FBUzs7OztJQUFqQjtRQUNJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Ozs7Ozs7SUFFTyx5REFBcUI7Ozs7Ozs7SUFBN0IsVUFBOEIsSUFBWSxFQUFFLGFBQXNCLEVBQUUsVUFBbUI7O1lBQzdFLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVk7UUFFdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3hCLENBQUMsWUFBWSxLQUFLLElBQUk7Z0JBQ2xCLFlBQVksS0FBSyxJQUFJO2dCQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsS0FBSztnQkFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEtBQUssYUFBYTtnQkFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEtBQUssVUFBVTtnQkFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQXRiYyxnREFBc0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3JELDRDQUFrQixHQUFHLElBQUksR0FBRyxFQUFnQyxDQUFDOztnQkFMOUUsU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSxvQkFBb0I7aUJBQ2pDOzs7O2dCQXRERyxVQUFVO2dCQU1WLFNBQVM7OzsyQkF3RVIsS0FBSyxTQUFDLFVBQVU7aUNBY2hCLEtBQUssU0FBQyxnQkFBZ0I7aUNBTXRCLEtBQUssU0FBQyxnQkFBZ0I7NEJBZXRCLEtBQUssU0FBQyxXQUFXO3dCQXFCakIsS0FBSyxTQUFDLE9BQU87c0JBc0JiLEtBQUssU0FBQyxLQUFLO3lCQWFYLEtBQUssU0FBQyxRQUFRO3VCQUdkLEtBQUssU0FBQyxNQUFNOztJQUViO1FBREMsaUJBQWlCLENBQUMsZ0VBQWdFLENBQUM7OzJEQUNoRTtJQWlVeEIsZ0NBQUM7Q0FBQSxBQTNiRCxJQTJiQztTQXhiWSx5QkFBeUI7Ozs7OztJQUNsQyxpREFBbUU7O0lBQ25FLDZDQUEyRTs7Ozs7SUFFM0Usb0RBQXFDOzs7OztJQUNyQyx5Q0FBb0I7Ozs7O0lBQ3BCLDhDQUEyQzs7Ozs7SUFDM0Msb0RBQWdDOzs7OztJQUNoQyxxREFBaUM7Ozs7O0lBQ2pDLHdEQUFpQzs7Ozs7SUFDakMsa0RBQStCOzs7Ozs7Ozs7Ozs7O0lBYS9CLDZDQUN3Qjs7Ozs7Ozs7Ozs7OztJQWF4QixtREFDOEI7Ozs7O0lBSzlCLG1EQUM4Qjs7Ozs7Ozs7Ozs7Ozs7SUFjOUIsOENBQ3NCOzs7OztJQUV0QiwyQ0FBb0I7Ozs7Ozs7Ozs7OztJQXdDcEIsd0NBQ2dCOzs7Ozs7Ozs7Ozs7SUFZaEIsMkNBQ21COztJQUVuQix5Q0FFb0I7Ozs7O0lBWXBCLGtEQUEwQjs7Ozs7SUFFMUIsK0NBQXdCOzs7OztJQUV4Qiw2Q0FBMEM7Ozs7O0lBcUI5Qiw0Q0FBMkI7O0lBQUUsNkNBQTBCOzs7OztBQWlTdkU7SUFBQTtJQUlzQyxDQUFDOztnQkFKdEMsUUFBUSxTQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztpQkFDdkM7O0lBQ3FDLDZCQUFDO0NBQUEsQUFKdkMsSUFJdUM7U0FBMUIsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIEFmdGVyVmlld0NoZWNrZWRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZXByZWNhdGVQcm9wZXJ0eSB9IGZyb20gJy4uLy4uL2NvcmUvZGVwcmVjYXRlRGVjb3JhdG9ycyc7XG5cbmludGVyZmFjZSBJU2VhcmNoSW5mbyB7XG4gICAgc2VhcmNoZWRUZXh0OiBzdHJpbmc7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG1hdGNoQ291bnQ6IG51bWJlcjtcbiAgICBjYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xuICAgIGV4YWN0TWF0Y2g6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3RpdmUgaGlnaGxpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBY3RpdmVIaWdobGlnaHRJbmZvIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGluZGV4IG9mIHRoZSBoaWdobGlnaHQuIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCwgdXNlIGByb3dgIGluc3RlYWQuXG4gICAgICovXG4gICAgcm93SW5kZXg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSBgY29sdW1uYCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNvbHVtbkluZGV4PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYWdlIGluZGV4IG9mIHRoZSBoaWdobGlnaHQuIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC5cbiAgICAgKi9cbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgb2YgdGhlIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICByb3c/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbHVtbiBvZiB0aGUgaGlnaGxpZ2h0LlxuICAgICAqL1xuICAgIGNvbHVtbj86IGFueTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBpbmRleDogbnVtYmVyO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hUZXh0SGlnaGxpZ2h0XSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBvbkFjdGl2ZUVsZW1lbnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgcHVibGljIHN0YXRpYyBoaWdobGlnaHRHcm91cHNNYXAgPSBuZXcgTWFwPHN0cmluZywgSUFjdGl2ZUhpZ2hsaWdodEluZm8+KCk7XG5cbiAgICBwcml2YXRlIF9sYXN0U2VhcmNoSW5mbzogSVNlYXJjaEluZm87XG4gICAgcHJpdmF0ZSBfZGl2ID0gbnVsbDtcbiAgICBwcml2YXRlIF9vYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG4gICAgcHJpdmF0ZSBfbm9kZVdhc1JlbW92ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9mb3JjZUV2YWx1YXRpb24gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9hY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcbiAgICBwcml2YXRlIF92YWx1ZUNoYW5nZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBgQ1NTYCBjbGFzcyBvZiB0aGUgaGlnaGxpZ2h0IGVsZW1lbnRzLlxuICAgICAqIFRoaXMgYWxsb3dzIHRoZSBkZXZlbG9wZXIgdG8gcHJvdmlkZSBjdXN0b20gYENTU2AgdG8gY3VzdG9taXplIHRoZSBoaWdobGlnaHQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGRpdlxuICAgICAqICAgaWd4VGV4dEhpZ2hsaWdodFxuICAgICAqICAgW2Nzc0NsYXNzXT1cIm15Q2xhc3NcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2Nzc0NsYXNzJylcbiAgICBwdWJsaWMgY3NzQ2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGBDU1NgIGNsYXNzIG9mIHRoZSBhY3RpdmUgaGlnaGxpZ2h0IGVsZW1lbnQuXG4gICAgICogVGhpcyBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBwcm92aWRlIGN1c3RvbSBgQ1NTYCB0byBjdXN0b21pemUgdGhlIGhpZ2hsaWdodC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbYWN0aXZlQ3NzQ2xhc3NdPVwiYWN0aXZlSGlnaGxpZ2h0Q2xhc3NcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FjdGl2ZUNzc0NsYXNzJylcbiAgICBwdWJsaWMgYWN0aXZlQ3NzQ2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASW5wdXQoJ2NvbnRhaW5lckNsYXNzJylcbiAgICBwdWJsaWMgY29udGFpbmVyQ2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXMgdGhlIGhpZ2hsaWdodCB3aXRoaW4gYSB1bmlxdWUgZ3JvdXAuXG4gICAgICogVGhpcyBhbGxvd3MgaXQgdG8gaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBoaWdobGlnaHQgZ3JvdXBzLFxuICAgICAqIHdpdGggZWFjaCBvZiB0aGVtIGhhdmluZyB0aGVpciBvd24gYWN0aXZlIGhpZ2hsaWdodC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbZ3JvdXBOYW1lXT1cIm15R3JvdXBOYW1lXCI+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdncm91cE5hbWUnKVxuICAgIHB1YmxpYyBncm91cE5hbWUgPSAnJztcblxuICAgIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdW5kZXJseWluZyB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgaGlnaGxpZ2h0ZWQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogY29uc3QgZWxlbWVudFZhbHVlID0gdGhpcy50ZXh0SGlnaGxpZ2h0LnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbdmFsdWVdPVwibmV3VmFsdWVcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByb3cgb24gd2hpY2ggdGhlIGRpcmVjdGl2ZSBpcyBjdXJyZW50bHkgb24uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGRpdlxuICAgICAqICAgaWd4VGV4dEhpZ2hsaWdodFxuICAgICAqICAgW3Jvd109XCIwXCI+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdyb3cnKVxuICAgIHB1YmxpYyByb3c6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb2x1bW4gb24gd2hpY2ggdGhlIGRpcmVjdGl2ZSBpcyBjdXJyZW50bHkgb24uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGRpdlxuICAgICAqICAgaWd4VGV4dEhpZ2hsaWdodFxuICAgICAqICAgW2NvbHVtbl09XCIwXCI+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdjb2x1bW4nKVxuICAgIHB1YmxpYyBjb2x1bW46IGFueTtcblxuICAgIEBJbnB1dCgncGFnZScpXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KGBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlICdwYWdlJyBpbnB1dCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLmApXG4gICAgcHVibGljIHBhZ2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhc3RTZWFyY2hJbmZvKCk6IElTZWFyY2hJbmZvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RTZWFyY2hJbmZvO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50RWxlbWVudDogYW55O1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBhbnk7XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgaGlnaGxpZ2h0IGF0IGEgZ2l2ZW4gaW5kZXguXG4gICAgICogKGlmIHN1Y2ggaW5kZXggZXhpc3RzKVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0QWN0aXZlSGlnaGxpZ2h0KGdyb3VwTmFtZTogc3RyaW5nLCBoaWdobGlnaHQ6IElBY3RpdmVIaWdobGlnaHRJbmZvKSB7XG4gICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuaGlnaGxpZ2h0R3JvdXBzTWFwLnNldChncm91cE5hbWUsIGhpZ2hsaWdodCk7XG4gICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUub25BY3RpdmVFbGVtZW50Q2hhbmdlZC5lbWl0KGdyb3VwTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFueSBleGlzdGluZyBoaWdobGlnaHQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFjdGl2ZUhpZ2hsaWdodChncm91cE5hbWUpIHtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KGdyb3VwTmFtZSwge1xuICAgICAgICAgICAgaW5kZXg6IC0xXG4gICAgICAgIH0pO1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLm9uQWN0aXZlRWxlbWVudENoYW5nZWQuZW1pdChncm91cE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZiwgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5vbkFjdGl2ZUVsZW1lbnRDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBOYW1lID09PSBncm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhckhpZ2hsaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9vYnNlcnZlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnZhbHVlICYmICFjaGFuZ2VzLnZhbHVlLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKChjaGFuZ2VzLnJvdyAhPT0gdW5kZWZpbmVkICYmICFjaGFuZ2VzLnJvdy5maXJzdENoYW5nZSkgfHxcbiAgICAgICAgICAgIChjaGFuZ2VzLmNvbHVtbiAhPT0gdW5kZWZpbmVkICYmICFjaGFuZ2VzLmNvbHVtbi5maXJzdENoYW5nZSkgfHxcbiAgICAgICAgICAgIChjaGFuZ2VzLnBhZ2UgIT09IHVuZGVmaW5lZCAmJiAhY2hhbmdlcy5wYWdlLmZpcnN0Q2hhbmdlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVJZk5lY2Vzc2FyeSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICBpZiAoSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuaGFzKHRoaXMuZ3JvdXBOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuaGlnaGxpZ2h0R3JvdXBzTWFwLnNldCh0aGlzLmdyb3VwTmFtZSwge1xuICAgICAgICAgICAgICAgIGluZGV4OiAtMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaGVkVGV4dDogJycsXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgbWF0Y2hDb3VudDogMCxcbiAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICAgICAgZXhhY3RNYXRjaDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLnBhcmVudEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQodGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoZWRUZXh0LCB0aGlzLl9sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0a