UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

295 lines 23 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'; var SplitterService = /** @class */ (function () { function SplitterService() { this.paneCount = 0; } // 配置pane信息,panes列表,方向,容器大小,方便后续计算使用 // 配置pane信息,panes列表,方向,容器大小,方便后续计算使用 /** * @param {?} __0 * @return {?} */ SplitterService.prototype.configPane = // 配置pane信息,panes列表,方向,容器大小,方便后续计算使用 /** * @param {?} __0 * @return {?} */ function (_a) { var panes = _a.panes, orientation = _a.orientation, containerSize = _a.containerSize; this.panes = panes; this.panes.forEach((/** * @param {?} pane * @param {?} index * @return {?} */ function (pane, index) { pane.order = index * 2; pane.orientation = orientation; })); this.paneCount = this.panes.length; this.containerSize = containerSize; }; // 按下的时候计算pane的size信息 // 按下的时候计算pane的size信息 /** * @param {?} splitbarIndex * @return {?} */ SplitterService.prototype.dragState = // 按下的时候计算pane的size信息 /** * @param {?} splitbarIndex * @return {?} */ function (splitbarIndex) { /** @type {?} */ var prev = this.getPane(splitbarIndex); /** @type {?} */ var next = this.getPane(splitbarIndex + 1); /** @type {?} */ var 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大小 // 设置pane大小 /** * @param {?} state * @param {?} distance * @return {?} */ SplitterService.prototype.setSize = // 设置pane大小 /** * @param {?} state * @param {?} distance * @return {?} */ function (state, distance) { /** @type {?} */ var prev = this.getPane(state.prev.index); /** @type {?} */ var 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)大于最大值时取最大值 // 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值 /** * @param {?} minSize * @param {?} maxSize * @param {?} initialSize * @return {?} */ SplitterService.prototype.clamp = // 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值 /** * @param {?} minSize * @param {?} maxSize * @param {?} initialSize * @return {?} */ function (minSize, maxSize, initialSize) { return Math.min(maxSize, Math.max(minSize, initialSize)); }; // resize pane的大小 // resize pane的大小 /** * @param {?} paneState * @param {?} moveSize * @return {?} */ SplitterService.prototype.resize = // resize pane的大小 /** * @param {?} paneState * @param {?} moveSize * @return {?} */ function (paneState, moveSize) { /** @type {?} */ var pane = this.getPane(paneState.index); /** @type {?} */ var splitterSize = this.containerSize(); /** @type {?} */ var newSize = this.clamp(paneState.minSize, paneState.maxSize, paneState.initialSize + moveSize); /** @type {?} */ var size = ''; if (this.isPercent(pane.size)) { size = (100 * newSize / splitterSize) + '%'; } else { size = newSize + 'px'; } pane.size = size; pane.sizeChange.emit(size); }; // 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效 // 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效 /** * @param {?} splitBarIndex * @return {?} */ SplitterService.prototype.isResizable = // 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效 /** * @param {?} splitBarIndex * @return {?} */ function (splitBarIndex) { /** @type {?} */ var prevPane = this.getPane(splitBarIndex); /** @type {?} */ var nextPane = this.getPane(splitBarIndex + 1); /** @type {?} */ var paneCollapsed = prevPane.collapsed || nextPane.collapsed; return prevPane.resizable && nextPane.resizable && !paneCollapsed; }; // 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar // 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar /** * @param {?} splitBarIndex * @return {?} */ SplitterService.prototype.isStaticBar = // 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar /** * @param {?} splitBarIndex * @return {?} */ function (splitBarIndex) { /** @type {?} */ var prevPane = this.getPane(splitBarIndex); /** @type {?} */ var nextPane = this.getPane(splitBarIndex + 1); return !(prevPane.resizable && nextPane.resizable); }; // 获取pane,防止没有初始化的时候调用内部方法取值 // 获取pane,防止没有初始化的时候调用内部方法取值 /** * @param {?} index * @return {?} */ SplitterService.prototype.getPane = // 获取pane,防止没有初始化的时候调用内部方法取值 /** * @param {?} index * @return {?} */ function (index) { if (!this.panes || index < 0 || index >= this.panes.length) { throw new Error('no pane can return.'); } return this.panes[index]; }; // 判断是不是百分比设置宽度 // 判断是不是百分比设置宽度 /** * @param {?} size * @return {?} */ SplitterService.prototype.isPercent = // 判断是不是百分比设置宽度 /** * @param {?} size * @return {?} */ function (size) { return /%$/.test(size); }; // 计算时把百分比转换为像素 // 计算时把百分比转换为像素 /** * @param {?} size * @return {?} */ SplitterService.prototype.toPixels = // 计算时把百分比转换为像素 /** * @param {?} size * @return {?} */ function (size) { // 值不满足转换时,result为NAN,方便计算最小、最大宽度判断 /** @type {?} */ var result = parseFloat(size); if (this.isPercent(size)) { result = (this.containerSize() * result / 100); } return result; }; // 切换pane展开,收起 // 切换pane展开,收起 /** * @param {?} paneIndex * @param {?} nearPaneIndex * @return {?} */ SplitterService.prototype.togglePane = // 切换pane展开,收起 /** * @param {?} paneIndex * @param {?} nearPaneIndex * @return {?} */ function (paneIndex, nearPaneIndex) { /** @type {?} */ var pane = this.getPane(paneIndex); /** @type {?} */ var nearPane = this.getPane(nearPaneIndex); if (pane.collapsible) { pane.collapsed = !pane.collapsed; pane.toggleCollapseClass(); nearPane.toggleNearPaneFlexGrow(); pane.collapsedChange.emit(pane.collapsed); } }; SplitterService.decorators = [ { type: Injectable } ]; return SplitterService; }()); export { SplitterService }; if (false) { /** @type {?} */ SplitterService.prototype.panes; /** * @type {?} * @private */ SplitterService.prototype.containerSize; /** @type {?} */ SplitterService.prototype.paneCount; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3NwbGl0dGVyLyIsInNvdXJjZXMiOlsic3BsaXR0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0M7SUFBQTtRQUlFLGNBQVMsR0FBRyxDQUFDLENBQUM7SUEwSGhCLENBQUM7SUF4SEMsb0NBQW9DOzs7Ozs7SUFDcEMsb0NBQVU7Ozs7OztJQUFWLFVBQVcsRUFBbUM7WUFBbEMsZ0JBQUssRUFBRSw0QkFBVyxFQUFFLGdDQUFhO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELHFCQUFxQjs7Ozs7O0lBQ3JCLG1DQUFTOzs7Ozs7SUFBVCxVQUFVLGFBQWE7O1lBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDOztZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDOztZQUN0QyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtRQUNuRCxPQUFPO1lBQ0gsSUFBSSxFQUFFO2dCQUNGLEtBQUssRUFBRSxhQUFhO2dCQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7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OztJQUNmLG1DQUFTOzs7Ozs7SUFBVCxVQUFVLElBQUk7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7Ozs7OztJQUNmLGtDQUFROzs7Ozs7SUFBUixVQUFTLElBQUk7OztZQUVQLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGNBQWM7Ozs7Ozs7SUFDZCxvQ0FBVTs7Ozs7OztJQUFWLFVBQVcsU0FBUyxFQUFFLGFBQWE7O1lBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7WUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDOztnQkE3SEYsVUFBVTs7SUE4SFgsc0JBQUM7Q0FBQSxBQTlIRCxJQThIQztTQTdIWSxlQUFlOzs7SUFDMUIsZ0NBQW9DOzs7OztJQUNwQyx3Q0FBZ0M7O0lBQ2hDLG9DQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTcGxpdHRlclBhbmVDb21wb25lbnQgfSBmcm9tICcuL3NwbGl0dGVyLXBhbmUuY29tcG9uZW50JztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNwbGl0dGVyU2VydmljZSB7XHJcbiAgcGFuZXM6IEFycmF5PFNwbGl0dGVyUGFuZUNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBjb250YWluZXJTaXplOiBGdW5jdGlvbjtcclxuICBwYW5lQ291bnQgPSAwO1xyXG5cclxuICAvLyDphY3nva5wYW5l5L+h5oGv77yMcGFuZXPliJfooajvvIzmlrnlkJHvvIzlrrnlmajlpKflsI/vvIzmlrnkvr/lkI7nu63orqHnrpfkvb/nlKhcclxuICBjb25maWdQYW5lKHtwYW5lcywgb3JpZW50YXRpb24sIGNvbnRhaW5lclNpemV9KSB7XHJcbiAgICB0aGlzLnBhbmVzID0gcGFuZXM7XHJcbiAgICB0aGlzLnBhbmVzLmZvckVhY2goKHBhbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgIHBhbmUub3JkZXIgPSBpbmRleCAqIDI7XHJcbiAgICAgIHBhbmUub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5wYW5lQ291bnQgPSB0aGlzLnBhbmVzLmxlbmd0aDtcclxuICAgIHRoaXMuY29udGFpbmVyU2l6ZSA9IGNvbnRhaW5lclNpemU7XHJcbiAgfVxyXG5cclxuICAvLyDmjInkuIvnmoTml7blgJnorqHnrpdwYW5l55qEc2l6ZeS/oeaBr1xyXG4gIGRyYWdTdGF0ZShzcGxpdGJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5nZXRQYW5lKHNwbGl0YmFySW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0UGFuZShzcGxpdGJhckluZGV4ICsgMSk7XHJcbiAgICBjb25zdCB0b3RhbCA9IHByZXYuY29tcHV0ZWRTaXplICsgbmV4dC5jb21wdXRlZFNpemU7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHByZXY6IHtcclxuICAgICAgICAgICAgaW5kZXg6IHNwbGl0YmFySW5kZXgsXHJcbiAgICAgICAgICAgIGluaXRpYWxTaXplOiBwcmV2LmNvbXB1dGVkU2l6ZSxcclxuICAgICAgICAgICAgLy8g6K6+572u5pyJ5pyA5bCP5YC877yM55u05o6l5Y+W5YC877yM5aaC5p6c5rKh5pyJ6K6+572u5bCx55So5Lik5LiqcGFuZeaAu+WSjOWHj+WOu+ebuOmCu3BhbmXnmoTmnIDlpKflgLzvvIzpg73msqHorr7nva7vvIhOQU7vvInlnKjlj5YwXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMudG9QaXhlbHMocHJldi5taW5TaXplKSB8fCB0b3RhbCAtIHRoaXMudG9QaXhlbHMobmV4dC5tYXhTaXplKSB8fCAwLFxyXG4gICAgICAgICAgICAvLyDorr7nva7mnInmnIDlpKflgLzvvIznm7TmjqXlj5blgLzvvIzlpoLmnpzmsqHmnInorr7nva7lsLHnlKjkuKTkuKpwYW5l5oC75ZKM5YeP5Y6755u46YK7cGFuZeeahOacgOWwj+WAvO+8jOmDveayoeiuvue9ru+8iE5BTu+8ieWcqOWPluS4pOS4qnBhbmXmgLvlkoxcclxuICAgICAgICAgICAgbWF4U2l6ZTogdGhpcy50b1BpeGVscyhwcmV2Lm1heFNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhuZXh0Lm1pblNpemUpIHx8IHRvdGFsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBuZXh0OiB7XHJcbiAgICAgICAgICAgIGluZGV4OiBzcGxpdGJhckluZGV4ICsgMSxcclxuICAgICAgICAgICAgaW5pdGlhbFNpemU6IG5leHQuY29tcHV0ZWRTaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLnRvUGl4ZWxzKG5leHQubWluU2l6ZSkgfHwgdG90YWwgLSB0aGlzLnRvUGl4ZWxzKHByZXYubWF4U2l6ZSkgfHwgMCxcclxuICAgICAgICAgICAgbWF4U2l6ZTogdGhpcy50b1BpeGVscyhuZXh0Lm1heFNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhwcmV2Lm1pblNpemUpIHx8IHRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9rnBhbmXlpKflsI9cclxuICBzZXRTaXplKHN0YXRlLCBkaXN0YW5jZSkge1xyXG4gICAgY29uc3QgcHJldiA9IHRoaXMuZ2V0UGFuZShzdGF0ZS5wcmV2LmluZGV4KTtcclxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldFBhbmUoc3RhdGUubmV4dC5pbmRleCk7XHJcbiAgICBpZiAocHJldi5zaXplICYmIG5leHQuc2l6ZSkge1xyXG4gICAgICAvLyDnm7jpgrvnmoTkuKTkuKpwYW5l6YO95oyH5a6a5LqGc2l6Ze+8jOmcgOimgeWQjOaXtuS/ruaUuXNpemVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUucHJldiwgZGlzdGFuY2UpO1xyXG4gICAgICB0aGlzLnJlc2l6ZShzdGF0ZS5uZXh0LCAtZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIGlmIChuZXh0LnNpemUpIHtcclxuICAgICAgLy8g5aaC5p6cIG5leHQgcGFuZe+8jOaMh+WumuS6hnNpemXlsLHkv67mlLluZXh0IHBhbmVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUubmV4dCwgLWRpc3RhbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOacgOWQjuS4jeeuoXByZSBwYW5l77yM5pyJ5rKh5pyJ5oyH5a6a77yM6YO95L+u5pS5IHByZSBwYW5lXHJcbiAgICAgIHRoaXMucmVzaXplKHN0YXRlLnByZXYsIGRpc3RhbmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWkp+Wwj+mZkOWItuWHveaVsO+8jO+8iG1heO+8ieWwj+S6juacgOWwj+WAvOaXtuWPluacgOWwj+WAvO+8jCDvvIhtaW7vvInlpKfkuo7mnIDlpKflgLzml7blj5bmnIDlpKflgLxcclxuICBjbGFtcChtaW5TaXplLCBtYXhTaXplLCBpbml0aWFsU2l6ZSkge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKG1heFNpemUsIE1hdGgubWF4KG1pblNpemUsIGluaXRpYWxTaXplKSk7XHJcbiAgfVxyXG5cclxuICAvLyByZXNpemUgcGFuZeeahOWkp+Wwj1xyXG4gIHJlc2l6ZShwYW5lU3RhdGUsIG1vdmVTaXplKSB7XHJcbiAgICAgIGNvbnN0IHBhbmUgPSB0aGlzLmdldFBhbmUocGFuZVN0YXRlLmluZGV4KTtcclxuICAgICAgY29uc3Qgc3BsaXR0ZXJTaXplID0gdGhpcy5jb250YWluZXJTaXplKCk7XHJcbiAgICAgIGNvbnN0IG5ld1NpemUgPSB0aGlzLmNsYW1wKHBhbmVTdGF0ZS5taW5TaXplLCBwYW5lU3RhdGUubWF4U2l6ZSwgcGFuZVN0YXRlLmluaXRpYWxTaXplICsgbW92ZVNpemUpO1xyXG4gICAgICBsZXQgc2l6ZSA9ICcnO1xyXG4gICAgICBpZiAodGhpcy5pc1BlcmNlbnQocGFuZS5zaXplKSkge1xyXG4gICAgICAgICAgc2l6ZSA9ICgxMDAgKiBuZXdTaXplIC8gc3BsaXR0ZXJTaXplKSArICclJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNpemUgPSBuZXdTaXplICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICBwYW5lLnNpemUgPSBzaXplO1xyXG4gICAgICBwYW5lLnNpemVDaGFuZ2UuZW1pdChzaXplKTtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWrXBhbmXmmK/lkKblj6/ku6XosIPmlbTlpKflsI/vvIzlj6ropoHmnInkuIDovrnorr7nva7kuobkuI3lj6/osIPmlbTmiJbogIXmlLbotbfvvIznm7jpgrtwYW5l6LCD5pW05bCx5aSx5pWIXHJcbiAgaXNSZXNpemFibGUoc3BsaXRCYXJJbmRleCkge1xyXG4gICAgY29uc3QgcHJldlBhbmUgPSB0aGlzLmdldFBhbmUoc3BsaXRCYXJJbmRleCk7XHJcbiAgICBjb25zdCBuZXh0UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4ICsgMSk7XHJcbiAgICBjb25zdCBwYW5lQ29sbGFwc2VkID0gcHJldlBhbmUuY29sbGFwc2VkIHx8IG5leHRQYW5lLmNvbGxhcHNlZDtcclxuICAgIHJldHVybiBwcmV2UGFuZS5yZXNpemFibGUgJiYgbmV4dFBhbmUucmVzaXphYmxlICYmICFwYW5lQ29sbGFwc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5YiG5Ymy5p2h5piv5ZCm5piv5Zu65a6a55qE77yM5Y+q6KaB5pyJ5LiA6L655LiN6IO96LCD5pW0LCDlsLHmmK/npoHnlKjnirbmgIHlm7rlrppiYXJcclxuICBpc1N0YXRpY0JhcihzcGxpdEJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4KTtcclxuICAgIGNvbnN0IG5leHRQYW5lID0gdGhpcy5nZXRQYW5lKHNwbGl0QmFySW5kZXggKyAxKTtcclxuICAgIHJldHVybiAhKHByZXZQYW5lLnJlc2l6YWJsZSAmJiBuZXh0UGFuZS5yZXNpemFibGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WcGFuZe+8jOmYsuatouayoeacieWIneWni+WMlueahOaXtuWAmeiwg+eUqOWGhemDqOaWueazleWPluWAvFxyXG4gIGdldFBhbmUoaW5kZXgpIHtcclxuICAgIGlmICghdGhpcy5wYW5lcyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lcy5sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwYW5lIGNhbiByZXR1cm4uJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5wYW5lc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3mmK/kuI3mmK/nmb7liIbmr5Torr7nva7lrr3luqZcclxuICBpc1BlcmNlbnQoc2l6ZSkge1xyXG4gICAgcmV0dXJuIC8lJC8udGVzdChzaXplKTtcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+aXtuaKiueZvuWIhuavlOi9rOaNouS4uuWDj+e0oFxyXG4gIHRvUGl4ZWxzKHNpemUpIHtcclxuICAgIC8vIOWAvOS4jea7oei2s+i9rOaNouaXtu+8jHJlc3VsdOS4uk5BTu+8jOaWueS+v+iuoeeul+acgOWwj+OAgeacgOWkp+WuveW6puWIpOaWrVxyXG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlRmxvYXQoc2l6ZSk7XHJcbiAgICBpZiAodGhpcy5pc1BlcmNlbnQoc2l6ZSkpIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuY29udGFpbmVyU2l6ZSgpICogcmVzdWx0IC8gMTAwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyDliIfmjaJwYW5l5bGV5byA77yM5pS26LW3XHJcbiAgdG9nZ2xlUGFuZShwYW5lSW5kZXgsIG5lYXJQYW5lSW5kZXgpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLmdldFBhbmUocGFuZUluZGV4KTtcclxuICAgIGNvbnN0IG5lYXJQYW5lID0gdGhpcy5nZXRQYW5lKG5lYXJQYW5lSW5kZXgpO1xyXG4gICAgaWYgKHBhbmUuY29sbGFwc2libGUpIHtcclxuICAgICAgICBwYW5lLmNvbGxhcHNlZCA9ICFwYW5lLmNvbGxhcHNlZDtcclxuICAgICAgICBwYW5lLnRvZ2dsZUNvbGxhcHNlQ2xhc3MoKTtcclxuICAgICAgICBuZWFyUGFuZS50b2dnbGVOZWFyUGFuZUZsZXhHcm93KCk7XHJcbiAgICAgICAgcGFuZS5jb2xsYXBzZWRDaGFuZ2UuZW1pdChwYW5lLmNvbGxhcHNlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==