UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

210 lines 19.6 kB
/** * @fileoverview added by tsickle * Generated from: splitter.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; export class SplitterService { constructor() { this.paneCount = 0; } // 配置pane信息,panes列表,方向,容器大小,方便后续计算使用 /** * @param {?} __0 * @return {?} */ configPane({ panes, orientation, containerSize }) { this.panes = panes; this.panes.forEach((/** * @param {?} pane * @param {?} index * @return {?} */ (pane, index) => { pane.order = index * 2; pane.orientation = orientation; })); this.paneCount = this.panes.length; this.containerSize = containerSize; } // 按下的时候计算pane的size信息 /** * @param {?} splitbarIndex * @return {?} */ dragState(splitbarIndex) { /** @type {?} */ const prev = this.getPane(splitbarIndex); /** @type {?} */ const next = this.getPane(splitbarIndex + 1); /** @type {?} */ const total = prev.computedSize + next.computedSize; return { prev: { index: splitbarIndex, initialSize: prev.computedSize, // 设置有最小值,直接取值,如果没有设置就用两个pane总和减去相邻pane的最大值,都没设置(NAN)在取0 minSize: this.toPixels(prev.minSize) || total - this.toPixels(next.maxSize) || 0, // 设置有最大值,直接取值,如果没有设置就用两个pane总和减去相邻pane的最小值,都没设置(NAN)在取两个pane总和 maxSize: this.toPixels(prev.maxSize) || total - this.toPixels(next.minSize) || total }, next: { index: splitbarIndex + 1, initialSize: next.computedSize, minSize: this.toPixels(next.minSize) || total - this.toPixels(prev.maxSize) || 0, maxSize: this.toPixels(next.maxSize) || total - this.toPixels(prev.minSize) || total } }; } // 设置pane大小 /** * @param {?} state * @param {?} distance * @return {?} */ setSize(state, distance) { /** @type {?} */ const prev = this.getPane(state.prev.index); /** @type {?} */ const next = this.getPane(state.next.index); if (prev.size && next.size) { // 相邻的两个pane都指定了size,需要同时修改size this.resize(state.prev, distance); this.resize(state.next, -distance); } else if (next.size) { // 如果 next pane,指定了size就修改next pane this.resize(state.next, -distance); } else { // 最后不管pre pane,有没有指定,都修改 pre pane this.resize(state.prev, distance); } } // 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值 /** * @param {?} minSize * @param {?} maxSize * @param {?} initialSize * @return {?} */ clamp(minSize, maxSize, initialSize) { return Math.min(maxSize, Math.max(minSize, initialSize)); } // resize pane的大小 /** * @param {?} paneState * @param {?} moveSize * @return {?} */ resize(paneState, moveSize) { /** @type {?} */ const pane = this.getPane(paneState.index); /** @type {?} */ const splitterSize = this.containerSize(); /** @type {?} */ const newSize = this.clamp(paneState.minSize, paneState.maxSize, paneState.initialSize + moveSize); /** @type {?} */ let size = ''; if (this.isPercent(pane.size)) { size = (100 * newSize / splitterSize) + '%'; } else { size = newSize + 'px'; } pane.size = size; pane.sizeChange.emit(size); } // 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效 /** * @param {?} splitBarIndex * @return {?} */ isResizable(splitBarIndex) { /** @type {?} */ const prevPane = this.getPane(splitBarIndex); /** @type {?} */ const nextPane = this.getPane(splitBarIndex + 1); /** @type {?} */ const paneCollapsed = prevPane.collapsed || nextPane.collapsed; return prevPane.resizable && nextPane.resizable && !paneCollapsed; } // 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar /** * @param {?} splitBarIndex * @return {?} */ isStaticBar(splitBarIndex) { /** @type {?} */ const prevPane = this.getPane(splitBarIndex); /** @type {?} */ const nextPane = this.getPane(splitBarIndex + 1); return !(prevPane.resizable && nextPane.resizable); } // 获取pane,防止没有初始化的时候调用内部方法取值 /** * @param {?} index * @return {?} */ getPane(index) { if (!this.panes || index < 0 || index >= this.panes.length) { throw new Error('no pane can return.'); } return this.panes[index]; } // 判断是不是百分比设置宽度 /** * @param {?} size * @return {?} */ isPercent(size) { return /%$/.test(size); } // 计算时把百分比转换为像素 /** * @param {?} size * @return {?} */ toPixels(size) { // 值不满足转换时,result为NAN,方便计算最小、最大宽度判断 /** @type {?} */ let result = parseFloat(size); if (this.isPercent(size)) { result = (this.containerSize() * result / 100); } return result; } // 切换pane展开,收起 /** * @param {?} paneIndex * @param {?} nearPaneIndex * @return {?} */ togglePane(paneIndex, nearPaneIndex) { /** @type {?} */ const pane = this.getPane(paneIndex); /** @type {?} */ const nearPane = this.getPane(nearPaneIndex); if (pane.collapsible) { pane.collapsed = !pane.collapsed; pane.toggleCollapseClass(); nearPane.toggleNearPaneFlexGrow(); pane.collapsedChange.emit(pane.collapsed); } } } SplitterService.decorators = [ { type: Injectable } ]; if (false) { /** @type {?} */ SplitterService.prototype.panes; /** * @type {?} * @private */ SplitterService.prototype.containerSize; /** @type {?} */ SplitterService.prototype.paneCount; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3NwbGl0dGVyLyIsInNvdXJjZXMiOlsic3BsaXR0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFJRSxjQUFTLEdBQUcsQ0FBQyxDQUFDO0lBMEhoQixDQUFDOzs7Ozs7SUF2SEMsVUFBVSxDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPOzs7OztRQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQzs7Ozs7O0lBR0QsU0FBUyxDQUFDLGFBQWE7O2NBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDOztjQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDOztjQUN0QyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtRQUNuRCxPQUFPO1lBQ0gsSUFBSSxFQUFFO2dCQUNGLEtBQUssRUFBRSxhQUFhO2dCQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7O2dCQUU5QixPQUFPLEVBQUUsSUFBSSxDQUFD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QUFFO1lBQ3hCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7Ozs7O0lBR0QsVUFBVSxDQUFDLFNBQVMsRUFBRSxhQUFhOztjQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7O2NBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQzs7O1lBN0hGLFVBQVU7Ozs7SUFFVCxnQ0FBb0M7Ozs7O0lBQ3BDLHdDQUFnQzs7SUFDaEMsb0NBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNwbGl0dGVyUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vc3BsaXR0ZXItcGFuZS5jb21wb25lbnQnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU3BsaXR0ZXJTZXJ2aWNlIHtcclxuICBwYW5lczogQXJyYXk8U3BsaXR0ZXJQYW5lQ29tcG9uZW50PjtcclxuICBwcml2YXRlIGNvbnRhaW5lclNpemU6IEZ1bmN0aW9uO1xyXG4gIHBhbmVDb3VudCA9IDA7XHJcblxyXG4gIC8vIOmFjee9rnBhbmXkv6Hmga/vvIxwYW5lc+WIl+ihqO+8jOaWueWQke+8jOWuueWZqOWkp+Wwj++8jOaWueS+v+WQjue7reiuoeeul+S9v+eUqFxyXG4gIGNvbmZpZ1BhbmUoe3BhbmVzLCBvcmllbnRhdGlvbiwgY29udGFpbmVyU2l6ZX0pIHtcclxuICAgIHRoaXMucGFuZXMgPSBwYW5lcztcclxuICAgIHRoaXMucGFuZXMuZm9yRWFjaCgocGFuZSwgaW5kZXgpID0+IHtcclxuICAgICAgcGFuZS5vcmRlciA9IGluZGV4ICogMjtcclxuICAgICAgcGFuZS5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhbmVDb3VudCA9IHRoaXMucGFuZXMubGVuZ3RoO1xyXG4gICAgdGhpcy5jb250YWluZXJTaXplID0gY29udGFpbmVyU2l6ZTtcclxuICB9XHJcblxyXG4gIC8vIOaMieS4i+eahOaXtuWAmeiuoeeul3BhbmXnmoRzaXpl5L+h5oGvXHJcbiAgZHJhZ1N0YXRlKHNwbGl0YmFySW5kZXgpIHtcclxuICAgIGNvbnN0IHByZXYgPSB0aGlzLmdldFBhbmUoc3BsaXRiYXJJbmRleCk7XHJcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5nZXRQYW5lKHNwbGl0YmFySW5kZXggKyAxKTtcclxuICAgIGNvbnN0IHRvdGFsID0gcHJldi5jb21wdXRlZFNpemUgKyBuZXh0LmNvbXB1dGVkU2l6ZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJldjoge1xyXG4gICAgICAgICAgICBpbmRleDogc3BsaXRiYXJJbmRleCxcclxuICAgICAgICAgICAgaW5pdGlhbFNpemU6IHByZXYuY29tcHV0ZWRTaXplLFxyXG4gICAgICAgICAgICAvLyDorr7nva7mnInmnIDlsI/lgLzvvIznm7TmjqXlj5blgLzvvIzlpoLmnpzmsqHmnInorr7nva7lsLHnlKjkuKTkuKpwYW5l5oC75ZKM5YeP5Y6755u46YK7cGFuZeeahOacgOWkp+WAvO+8jOmDveayoeiuvue9ru+8iE5BTu+8ieWcqOWPljBcclxuICAgICAgICAgICAgbWluU2l6ZTogdGhpcy50b1BpeGVscyhwcmV2Lm1pblNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhuZXh0Lm1heFNpemUpIHx8IDAsXHJcbiAgICAgICAgICAgIC8vIOiuvue9ruacieacgOWkp+WAvO+8jOebtOaOpeWPluWAvO+8jOWmguaenOayoeacieiuvue9ruWwseeUqOS4pOS4qnBhbmXmgLvlkozlh4/ljrvnm7jpgrtwYW5l55qE5pyA5bCP5YC877yM6YO95rKh6K6+572u77yITkFO77yJ5Zyo5Y+W5Lik5LiqcGFuZeaAu+WSjFxyXG4gICAgICAgICAgICBtYXhTaXplOiB0aGlzLnRvUGl4ZWxzKHByZXYubWF4U2l6ZSkgfHwgdG90YWwgLSB0aGlzLnRvUGl4ZWxzKG5leHQubWluU2l6ZSkgfHwgdG90YWxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5leHQ6IHtcclxuICAgICAgICAgICAgaW5kZXg6IHNwbGl0YmFySW5kZXggKyAxLFxyXG4gICAgICAgICAgICBpbml0aWFsU2l6ZTogbmV4dC5jb21wdXRlZFNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMudG9QaXhlbHMobmV4dC5taW5TaXplKSB8fCB0b3RhbCAtIHRoaXMudG9QaXhlbHMocHJldi5tYXhTaXplKSB8fCAwLFxyXG4gICAgICAgICAgICBtYXhTaXplOiB0aGlzLnRvUGl4ZWxzKG5leHQubWF4U2l6ZSkgfHwgdG90YWwgLSB0aGlzLnRvUGl4ZWxzKHByZXYubWluU2l6ZSkgfHwgdG90YWxcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572ucGFuZeWkp+Wwj1xyXG4gIHNldFNpemUoc3RhdGUsIGRpc3RhbmNlKSB7XHJcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5nZXRQYW5lKHN0YXRlLnByZXYuaW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0UGFuZShzdGF0ZS5uZXh0LmluZGV4KTtcclxuICAgIGlmIChwcmV2LnNpemUgJiYgbmV4dC5zaXplKSB7XHJcbiAgICAgIC8vIOebuOmCu+eahOS4pOS4qnBhbmXpg73mjIflrprkuoZzaXpl77yM6ZyA6KaB5ZCM5pe25L+u5pS5c2l6ZVxyXG4gICAgICB0aGlzLnJlc2l6ZShzdGF0ZS5wcmV2LCBkaXN0YW5jZSk7XHJcbiAgICAgIHRoaXMucmVzaXplKHN0YXRlLm5leHQsIC1kaXN0YW5jZSk7XHJcbiAgICB9IGVsc2UgaWYgKG5leHQuc2l6ZSkge1xyXG4gICAgICAvLyDlpoLmnpwgbmV4dCBwYW5l77yM5oyH5a6a5LqGc2l6ZeWwseS/ruaUuW5leHQgcGFuZVxyXG4gICAgICB0aGlzLnJlc2l6ZShzdGF0ZS5uZXh0LCAtZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5pyA5ZCO5LiN566hcHJlIHBhbmXvvIzmnInmsqHmnInmjIflrprvvIzpg73kv67mlLkgcHJlIHBhbmVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUucHJldiwgZGlzdGFuY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5aSn5bCP6ZmQ5Yi25Ye95pWw77yM77yIbWF477yJ5bCP5LqO5pyA5bCP5YC85pe25Y+W5pyA5bCP5YC877yMIO+8iG1pbu+8ieWkp+S6juacgOWkp+WAvOaXtuWPluacgOWkp+WAvFxyXG4gIGNsYW1wKG1pblNpemUsIG1heFNpemUsIGluaXRpYWxTaXplKSB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4obWF4U2l6ZSwgTWF0aC5tYXgobWluU2l6ZSwgaW5pdGlhbFNpemUpKTtcclxuICB9XHJcblxyXG4gIC8vIHJlc2l6ZSBwYW5l55qE5aSn5bCPXHJcbiAgcmVzaXplKHBhbmVTdGF0ZSwgbW92ZVNpemUpIHtcclxuICAgICAgY29uc3QgcGFuZSA9IHRoaXMuZ2V0UGFuZShwYW5lU3RhdGUuaW5kZXgpO1xyXG4gICAgICBjb25zdCBzcGxpdHRlclNpemUgPSB0aGlzLmNvbnRhaW5lclNpemUoKTtcclxuICAgICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMuY2xhbXAocGFuZVN0YXRlLm1pblNpemUsIHBhbmVTdGF0ZS5tYXhTaXplLCBwYW5lU3RhdGUuaW5pdGlhbFNpemUgKyBtb3ZlU2l6ZSk7XHJcbiAgICAgIGxldCBzaXplID0gJyc7XHJcbiAgICAgIGlmICh0aGlzLmlzUGVyY2VudChwYW5lLnNpemUpKSB7XHJcbiAgICAgICAgICBzaXplID0gKDEwMCAqIG5ld1NpemUgLyBzcGxpdHRlclNpemUpICsgJyUnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2l6ZSA9IG5ld1NpemUgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHBhbmUuc2l6ZSA9IHNpemU7XHJcbiAgICAgIHBhbmUuc2l6ZUNoYW5nZS5lbWl0KHNpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5patcGFuZeaYr+WQpuWPr+S7peiwg+aVtOWkp+Wwj++8jOWPquimgeacieS4gOi+ueiuvue9ruS6huS4jeWPr+iwg+aVtOaIluiAheaUtui1t++8jOebuOmCu3BhbmXosIPmlbTlsLHlpLHmlYhcclxuICBpc1Jlc2l6YWJsZShzcGxpdEJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4KTtcclxuICAgIGNvbnN0IG5leHRQYW5lID0gdGhpcy5nZXRQYW5lKHNwbGl0QmFySW5kZXggKyAxKTtcclxuICAgIGNvbnN0IHBhbmVDb2xsYXBzZWQgPSBwcmV2UGFuZS5jb2xsYXBzZWQgfHwgbmV4dFBhbmUuY29sbGFwc2VkO1xyXG4gICAgcmV0dXJuIHByZXZQYW5lLnJlc2l6YWJsZSAmJiBuZXh0UGFuZS5yZXNpemFibGUgJiYgIXBhbmVDb2xsYXBzZWQ7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3liIblibLmnaHmmK/lkKbmmK/lm7rlrprnmoTvvIzlj6ropoHmnInkuIDovrnkuI3og73osIPmlbQsIOWwseaYr+emgeeUqOeKtuaAgeWbuuWummJhclxyXG4gIGlzU3RhdGljQmFyKHNwbGl0QmFySW5kZXgpIHtcclxuICAgIGNvbnN0IHByZXZQYW5lID0gdGhpcy5nZXRQYW5lKHNwbGl0QmFySW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dFBhbmUgPSB0aGlzLmdldFBhbmUoc3BsaXRCYXJJbmRleCArIDEpO1xyXG4gICAgcmV0dXJuICEocHJldlBhbmUucmVzaXphYmxlICYmIG5leHRQYW5lLnJlc2l6YWJsZSk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5ZwYW5l77yM6Ziy5q2i5rKh5pyJ5Yid5aeL5YyW55qE5pe25YCZ6LCD55So5YaF6YOo5pa55rOV5Y+W5YC8XHJcbiAgZ2V0UGFuZShpbmRleCkge1xyXG4gICAgaWYgKCF0aGlzLnBhbmVzIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnBhbmVzLmxlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHBhbmUgY2FuIHJldHVybi4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnBhbmVzW2luZGV4XTtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreaYr+S4jeaYr+eZvuWIhuavlOiuvue9ruWuveW6plxyXG4gIGlzUGVyY2VudChzaXplKSB7XHJcbiAgICByZXR1cm4gLyUkLy50ZXN0KHNpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5pe25oqK55m+5YiG5q+U6L2s5o2i5Li65YOP57SgXHJcbiAgdG9QaXhlbHMoc2l6ZSkge1xyXG4gICAgLy8g5YC85LiN5ruh6Laz6L2s5o2i5pe277yMcmVzdWx05Li6TkFO77yM5pa55L6/6K6h566X5pyA5bCP44CB5pyA5aSn5a695bqm5Yik5patXHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VGbG9hdChzaXplKTtcclxuICAgIGlmICh0aGlzLmlzUGVyY2VudChzaXplKSkge1xyXG4gICAgICByZXN1bHQgPSAodGhpcy5jb250YWluZXJTaXplKCkgKiByZXN1bHQgLyAxMDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNonBhbmXlsZXlvIDvvIzmlLbotbdcclxuICB0b2dnbGVQYW5lKHBhbmVJbmRleCwgbmVhclBhbmVJbmRleCkge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuZ2V0UGFuZShwYW5lSW5kZXgpO1xyXG4gICAgY29uc3QgbmVhclBhbmUgPSB0aGlzLmdldFBhbmUobmVhclBhbmVJbmRleCk7XHJcbiAgICBpZiAocGFuZS5jb2xsYXBzaWJsZSkge1xyXG4gICAgICAgIHBhbmUuY29sbGFwc2VkID0gIXBhbmUuY29sbGFwc2VkO1xyXG4gICAgICAgIHBhbmUudG9nZ2xlQ29sbGFwc2VDbGFzcygpO1xyXG4gICAgICAgIG5lYXJQYW5lLnRvZ2dsZU5lYXJQYW5lRmxleEdyb3coKTtcclxuICAgICAgICBwYW5lLmNvbGxhcHNlZENoYW5nZS5lbWl0KHBhbmUuY29sbGFwc2VkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19