UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

725 lines 57.1 kB
/** * @fileoverview added by tsickle * Generated from: tree-factory.class.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { forEach, isUndefined, map, omitBy, pickBy, reduce, trim, values } from 'lodash-es'; /** * @record */ export function ITreeNodeData() { } if (false) { /** @type {?|undefined} */ ITreeNodeData.prototype.id; /** @type {?|undefined} */ ITreeNodeData.prototype.parentId; /** @type {?|undefined} */ ITreeNodeData.prototype.title; /** @type {?|undefined} */ ITreeNodeData.prototype.isOpen; /** @type {?|undefined} */ ITreeNodeData.prototype.data; /** @type {?|undefined} */ ITreeNodeData.prototype.isParent; /** @type {?|undefined} */ ITreeNodeData.prototype.loading; /** @type {?|undefined} */ ITreeNodeData.prototype.isMatch; /** @type {?|undefined} */ ITreeNodeData.prototype.isHide; /** @type {?|undefined} */ ITreeNodeData.prototype.isActive; /** @type {?|undefined} */ ITreeNodeData.prototype.isChecked; /** @type {?|undefined} */ ITreeNodeData.prototype.disabled; /** @type {?|undefined} */ ITreeNodeData.prototype.children; /* Skipping unhandled member: [prop: string]: any;*/ } /** * @record */ export function ITreeMap() { } /** * @record */ export function ITreeItem() { } if (false) { /** @type {?} */ ITreeItem.prototype.title; /** @type {?|undefined} */ ITreeItem.prototype.open; /** @type {?|undefined} */ ITreeItem.prototype.loading; /** @type {?|undefined} */ ITreeItem.prototype.isMatch; /** @type {?|undefined} */ ITreeItem.prototype.items; /** @type {?|undefined} */ ITreeItem.prototype.isParent; /** @type {?|undefined} */ ITreeItem.prototype.data; /** @type {?|undefined} */ ITreeItem.prototype.id; /** @type {?|undefined} */ ITreeItem.prototype.isHide; /** @type {?|undefined} */ ITreeItem.prototype.isActive; /** @type {?|undefined} */ ITreeItem.prototype.isChecked; /** @type {?|undefined} */ ITreeItem.prototype.halfChecked; /** @type {?|undefined} */ ITreeItem.prototype.disabled; /** @type {?|undefined} */ ITreeItem.prototype.disableAdd; /** @type {?|undefined} */ ITreeItem.prototype.disableEdit; /** @type {?|undefined} */ ITreeItem.prototype.disableDelete; /* Skipping unhandled member: [prop: string]: any;*/ } /** * @record */ export function ITreeInput() { } if (false) { /** @type {?} */ ITreeInput.prototype.treeItems; /** @type {?|undefined} */ ITreeInput.prototype.parentId; /** @type {?|undefined} */ ITreeInput.prototype.treeNodeChildrenKey; /** @type {?|undefined} */ ITreeInput.prototype.treeNodeIdKey; /** @type {?|undefined} */ ITreeInput.prototype.checkboxDisabledKey; /** @type {?|undefined} */ ITreeInput.prototype.treeNodeTitleKey; } export class TreeNode { /** * @param {?} id * @param {?} parentId * @param {?} data */ constructor(id, parentId, data) { this.id = id; this.parentId = parentId; this.data = data; } } if (false) { /** @type {?} */ TreeNode.prototype.id; /** @type {?} */ TreeNode.prototype.parentId; /** @type {?} */ TreeNode.prototype.data; } export class TreeFactory { constructor() { this._checked = new Set(); this._treeRoot = []; this.mapTreeItems = (/** * @template THIS * @this {THIS} * @param {?} __0 * @return {THIS} */ ({ treeItems, parentId, treeNodeChildrenKey = 'items', treeNodeIdKey = 'id', checkboxDisabledKey = 'disabled', treeNodeTitleKey = 'title' }) => { forEach(treeItems, (/** * @param {?} item * @return {?} */ (item) => { /** @type {?} */ const node = this.addNode({ id: item[treeNodeIdKey], parentId, title: item[treeNodeTitleKey], isOpen: !!item.open, data: item.data || {}, originItem: item, isParent: !!item.isParent || !!(item[treeNodeChildrenKey] && item[treeNodeChildrenKey].length > 0), loading: !!item.loading, isMatch: !!item.isMatch, isHide: !!item.isHide, isChecked: !!item.isChecked, halfChecked: !!item.halfChecked, isActive: !!item.isActive, disabled: !!item[checkboxDisabledKey], disableAdd: !!item.disableAdd, disableEdit: !!item.disableEdit, disableDelete: !!item.disableDelete, children: [] }); if (!!item.isChecked) { this._checked.add(node); } this.mapTreeItems({ treeItems: item[treeNodeChildrenKey] || [], parentId: node.id, treeNodeChildrenKey, treeNodeIdKey, checkboxDisabledKey, treeNodeTitleKey }); })); return this; }); this.idx = 0; this.nodes = {}; } /** * @return {?} */ static create() { return new TreeFactory(); } // tree model with items /** * @param {?} __0 * @return {?} */ static fromTree({ treeItems, treeNodeChildrenKey = 'items', treeNodeIdKey = 'id', checkboxDisabledKey = 'disabled', treeNodeTitleKey = 'title' }) { /** @type {?} */ const treeFactory = TreeFactory.create(); treeFactory.mapTreeItems({ treeItems, parentId: undefined, treeNodeChildrenKey, treeNodeIdKey, checkboxDisabledKey, treeNodeTitleKey }); return treeFactory; } /** * @param {?} __0 * @return {?} */ addNode(_a) { var { id, parentId } = _a, data = tslib_1.__rest(_a, ["id", "parentId"]); if (isUndefined(id)) { this.idx++; id = this.idx; } /** @type {?} */ const treeNode = new TreeNode(id, parentId, data); if (this.nodes.hasOwnProperty(treeNode.id)) { throw new Error(`Duplicated id: ${treeNode.id} detected, please specify unique ids in the tree.`); } this.nodes = Object.assign({}, this.nodes, { [treeNode.id]: treeNode }); this.addChildNode(this.nodes[parentId], treeNode); return treeNode; } /** * @param {?} id * @return {?} */ editNodeTitle(id) { this.nodes[id].data.editable = true; } /** * @template THIS * @this {THIS} * @param {?} id * @return {THIS} */ deleteNodeById(id) { /** @type {?} */ const node = (/** @type {?} */ (this)).nodes[id]; /** @type {?} */ const parentNode = (/** @type {?} */ (this)).nodes[node.parentId]; (/** @type {?} */ (this)).removeChildNode(parentNode, node); /** @type {?} */ const deleteItems = (/** * @param {?} nodeId * @return {?} */ (nodeId) => { /** @type {?} */ const children = (/** @type {?} */ (this)).getChildrenById(nodeId); (/** @type {?} */ (this)).nodes = omitBy((/** @type {?} */ (this)).nodes, (/** * @param {?} _node * @return {?} */ (_node) => { return _node.id === id; })); forEach(children, (/** * @param {?} child * @return {?} */ (child) => { deleteItems(child.id); })); }); deleteItems(id); if (parentNode && (!parentNode.data.children || !parentNode.data.children.length)) { parentNode.data.isParent = false; } return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} id * @return {THIS} */ toggleNodeById(id) { (/** @type {?} */ (this)).nodes[id].data.isOpen = !(/** @type {?} */ (this)).nodes[id].data.isOpen; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} id * @return {THIS} */ openNodesById(id) { (/** @type {?} */ (this)).nodes[id].data.isOpen = true; if ((/** @type {?} */ (this)).nodes[id].parentId !== undefined) { (/** @type {?} */ (this)).openNodesById((/** @type {?} */ (this)).nodes[id].parentId); } return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} id * @param {?=} closeChildren * @return {THIS} */ closeNodesById(id, closeChildren = false) { (/** @type {?} */ (this)).nodes[id].data.isOpen = false; if (closeChildren) { if ((/** @type {?} */ (this)).nodes[id] && (/** @type {?} */ (this)).nodes[id].data.children) { (/** @type {?} */ (this)).nodes[id].data.children.forEach((/** * @param {?} node * @return {?} */ (node) => { (/** @type {?} */ (this)).closeNodesById(node.id); })); } } return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} id * @return {THIS} */ disabledNodesById(id) { (/** @type {?} */ (this)).nodes[id].data.disabled = true; /** @type {?} */ const parentId = (/** @type {?} */ (this)).nodes[id].parentId; (/** @type {?} */ (this))._disabledParentNodes(parentId); /** @type {?} */ const disabledNodes = (/** * @param {?} nodeId * @return {?} */ (nodeId) => { /** @type {?} */ const children = (/** @type {?} */ (this)).getChildrenById(nodeId); if (children.length > 0) { children.forEach((/** * @param {?} child * @return {?} */ (child) => { (/** @type {?} */ (this)).nodes[child.id].data.disabled = true; disabledNodes(child.id); })); } }); disabledNodes(id); return (/** @type {?} */ (this)); } /** * @private * @param {?} parentId * @return {?} */ _disabledParentNodes(parentId) { /** @type {?} */ const children = this.getChildrenById(parentId); if (children.length < 1) { return; } /** @type {?} */ const result = reduce(children, (/** * @param {?} status * @param {?} child * @return {?} */ (status, child) => { return status && child.data.disabled; }), true); if (this.nodes[parentId]) { this.nodes[parentId].data.disabled = result; } } /** * @param {?} id * @param {?} checked * @return {?} */ checkNodesById(id, checked) { this.nodes[id].data.halfChecked = false; this.nodes[id].data.isChecked = checked; this.checkParentNodes(this.nodes[id]); this.checkChildNodes(this.nodes[id], checked); this.maintainCheckedNodeList(this.nodes[id], checked); return this.getCheckedNodes(); } /** * @private * @param {?} node * @return {?} */ checkParentNodes(node) { const { parentId } = node; /** @type {?} */ const parentNode = this.nodes[parentId]; if (parentNode) { /** @type {?} */ const childrenNode = this.getChildrenById(parentId); if (childrenNode.every((/** * @param {?} childNode * @return {?} */ childNode => childNode.data.isChecked && !childNode.data.halfChecked))) { parentNode.data.isChecked = true; parentNode.data.halfChecked = false; } else if (childrenNode.some((/** * @param {?} childNode * @return {?} */ childNode => childNode.data.halfChecked || childNode.data.isChecked))) { parentNode.data.isChecked = true; parentNode.data.halfChecked = true; } else { parentNode.data.isChecked = false; parentNode.data.halfChecked = false; } this.maintainCheckedNodeList(parentNode, parentNode.data.isChecked); this.checkParentNodes(parentNode); } } /** * @private * @param {?} node * @param {?} checked * @return {?} */ checkChildNodes(node, checked) { const { id } = node; /** @type {?} */ const childrenNode = this.getChildrenById(id); if (childrenNode.length > 0) { childrenNode.forEach((/** * @param {?} childNode * @return {?} */ childNode => { const { id: childId } = childNode; const { data: nodeData } = this.nodes[childId]; if (!nodeData.disabled) { nodeData.isChecked = checked; nodeData.halfChecked = false; this.maintainCheckedNodeList(childNode, checked); } this.checkChildNodes(childNode, checked); })); /** @type {?} */ const childrenFullCheckedCount = childrenNode.filter((/** * @param {?} __0 * @return {?} */ ({ data: nodeData }) => nodeData.isChecked)).length; /** @type {?} */ const childrenCheckedCount = childrenNode .filter((/** * @param {?} __0 * @return {?} */ ({ data: nodeData }) => nodeData.isChecked || nodeData.halfChecked)).length; node.data.halfChecked = childrenCheckedCount > 0 && childrenNode.length > childrenFullCheckedCount; } } /** * @return {?} */ getCheckedNodes() { return Array.from(this._checked); } /** * @return {?} */ getDisabledNodes() { /** @type {?} */ const results = pickBy(this.nodes, (/** * @param {?} node * @return {?} */ (node) => { return node.data.disabled === true; })); return values(results); } /** * @param {?} id * @return {?} */ activeNodeById(id) { this.deactivateAllNodes(); this.nodes[id].data.isActive = !this.nodes[id].data.isActive; } /** * @param {?} id * @return {?} */ getChildrenById(id) { if (this.nodes[id]) { return this.nodes[id].data.children || []; } else if (id === undefined) { return this._treeRoot; } return []; } /* * @deprecated * */ /** * @private * @return {?} */ toTree() { /** @type {?} */ const patchChildren = (/** * @param {?} nodes * @return {?} */ (nodes) => { return map(nodes, (/** * @param {?} node * @return {?} */ (node) => { return Object.assign({}, node, { children: patchChildren(this.getChildrenById(node.id)) }); })); }); return patchChildren(this.getChildrenById(undefined)); } /** * @param {?} id * @return {?} */ startLoading(id) { this.nodes[id].data.loading = true; } /** * @param {?} id * @return {?} */ endLoading(id) { this.nodes[id].data.loading = false; } /* * @deprecated */ /** * @private * @param {?} inputValue * @param {?=} hideUnmatched * @return {?} */ isMatchNode(inputValue, hideUnmatched) { /** @type {?} */ const target = trim(inputValue); this.resetSearchResults(); this.dfs(target.toLowerCase(), this._treeRoot, hideUnmatched); } /** * @param {?} id * @return {?} */ getNodeById(id) { return this.nodes[id].data; } /** * @template THIS * @this {THIS} * @param {?} id * @param {?} hide * @return {THIS} */ hideNodeById(id, hide) { (/** @type {?} */ (this)).nodes[id].data.isHide = hide; return (/** @type {?} */ (this)); } /** * @private * @param {?} node * @param {?} checked * @return {?} */ maintainCheckedNodeList(node, checked) { if (checked && !node.data.halfChecked) { this._checked.add(node); } else { this._checked.delete(node); } } /** * @private * @param {?} target * @param {?} tree * @param {?=} hideUnmatched * @return {?} */ dfs(target, tree, hideUnmatched) { if (!tree) { return false; } if (!target) { return false; } if (Array.isArray(tree)) { return tree.map((/** * @param {?} treeNode * @return {?} */ treeNode => { return this.dfs(target, treeNode, hideUnmatched); })); } else { /** @type {?} */ const treeNode = tree; /** @type {?} */ const treeChildren = this.getChildrenById(treeNode.id); /** @type {?} */ const selfMatched = treeNode.data.title.toLowerCase().includes(target); if (selfMatched) { treeNode.data.isMatch = true; } // Test if children matches target recursively, do not hide children if parent is matched. /** @type {?} */ const childrenMatched = this.dfs(target, treeChildren, hideUnmatched && !selfMatched).some((/** * @param {?} _ * @return {?} */ _ => !!_)); if (selfMatched || childrenMatched) { if (treeChildren.length > 0) { this.openNodesById(treeNode.id); } return true; } else { treeNode.data.isHide = hideUnmatched; return false; } } } /** * @param {?} parentNode * @param {?} childNode * @return {?} */ addChildNode(parentNode, childNode) { if (parentNode) { Array.isArray(parentNode.data.children) ? parentNode.data.children.push(childNode) : parentNode.data.children = [childNode]; } else { this._treeRoot.push(childNode); } } /** * @private * @param {?} parentNode * @param {?} childNode * @return {?} */ removeChildNode(parentNode, childNode) { if (parentNode) { parentNode.data.children = parentNode.data.children.filter((/** * @param {?} node * @return {?} */ node => node.id !== childNode.id)); } else { this._treeRoot = this._treeRoot.filter((/** * @param {?} node * @return {?} */ node => node.id !== childNode.id)); } } /** * @private * @return {?} */ resetSearchResults() { Object.keys(this.nodes).forEach((/** * @param {?} key * @return {?} */ (key) => { /** @type {?} */ const treeNode = this.nodes[key]; treeNode.data.isMatch = false; treeNode.data.isHide = false; })); } /** * @param {?} target * @param {?=} hideUnmatched * @return {?} */ searchTree(target, hideUnmatched = false) { target = trim(target); this.resetSearchResults(); return this.dfs(target.toLowerCase(), this._treeRoot, hideUnmatched); } /** * @return {?} */ get treeRoot() { return this._treeRoot; } /** * @return {?} */ deactivateAllNodes() { for (const id of Object.keys(this.nodes)) { this.nodes[id].data.isActive = false; } } } if (false) { /** @type {?} */ TreeFactory.prototype.nodes; /** * @type {?} * @private */ TreeFactory.prototype.idx; /** * @type {?} * @private */ TreeFactory.prototype._checked; /** * @type {?} * @private */ TreeFactory.prototype._treeRoot; /** @type {?} */ TreeFactory.prototype.mapTreeItems; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1mYWN0b3J5LmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvdHJlZS8iLCJzb3VyY2VzIjpbInRyZWUtZmFjdG9yeS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBR0wsT0FBTyxFQUNQLFdBQVcsRUFDWCxHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLE1BQU0sRUFDUCxNQUFNLFdBQVcsQ0FBQzs7OztBQUVuQixtQ0FpQkM7OztJQWhCQywyQkFBWTs7SUFDWixpQ0FBa0I7O0lBQ2xCLDhCQUFlOztJQUNmLCtCQUFpQjs7SUFDakIsNkJBQVc7O0lBQ1gsaUNBQW1COztJQUNuQixnQ0FBa0I7O0lBQ2xCLGdDQUFrQjs7SUFDbEIsK0JBQWlCOztJQUNqQixpQ0FBbUI7O0lBQ25CLGtDQUFvQjs7SUFDcEIsaUNBQW1COztJQUluQixpQ0FBYzs7Ozs7O0FBR2hCLDhCQUVDOzs7O0FBRUQsK0JBb0JDOzs7SUFuQkMsMEJBQWM7O0lBQ2QseUJBQWU7O0lBQ2YsNEJBQWtCOztJQUNsQiw0QkFBa0I7O0lBQ2xCLDBCQUFvQjs7SUFDcEIsNkJBQW1COztJQUNuQix5QkFBVzs7SUFDWCx1QkFBUzs7SUFDVCwyQkFBaUI7O0lBQ2pCLDZCQUFtQjs7SUFDbkIsOEJBQW9COztJQUNwQixnQ0FBc0I7O0lBQ3RCLDZCQUFtQjs7SUFJbkIsK0JBQXFCOztJQUNyQixnQ0FBc0I7O0lBQ3RCLGtDQUF3Qjs7Ozs7O0FBRzFCLGdDQU9DOzs7SUFOQywrQkFBNEI7O0lBQzVCLDhCQUFrQjs7SUFDbEIseUNBQTZCOztJQUM3QixtQ0FBdUI7O0lBQ3ZCLHlDQUE2Qjs7SUFDN0Isc0NBQTBCOztBQUc1QixNQUFNLE9BQU8sUUFBUTs7Ozs7O0lBQ25CLFlBQW1CLEVBQUUsRUFDWixRQUFRLEVBQ1IsSUFBSTtRQUZNLE9BQUUsR0FBRixFQUFFLENBQUE7UUFDWixhQUFRLEdBQVIs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QUM7Ozs7OztJQUVNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxHQUFHLEtBQUs7UUFDN0MsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7OztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOzs7O0lBQ00sa0JBQWtCO1FBQ3ZCLEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN0QztJQUNILENBQUM7Q0FDRjs7O0lBL1dDLDRCQUE0Qjs7Ozs7SUFDNUIsMEJBQW9COzs7OztJQUNwQiwrQkFBcUM7Ozs7O0lBQ3JDLGdDQUFtQzs7SUF3Qm5DLG1DQXdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGljdGlvbmFyeSxcclxuICBmaWx0ZXIsXHJcbiAgZm9yRWFjaCxcclxuICBpc1VuZGVmaW5lZCxcclxuICBtYXAsXHJcbiAgb21pdEJ5LFxyXG4gIHBpY2tCeSxcclxuICByZWR1Y2UsXHJcbiAgdHJpbSxcclxuICB2YWx1ZXNcclxufSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVHJlZU5vZGVEYXRhIHtcclxuICBpZD86IG51bWJlcjtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBpc09wZW4/OiBib29sZWFuO1xyXG4gIGRhdGE/OiBhbnk7XHJcbiAgaXNQYXJlbnQ/OiBib29sZWFuO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG4gIGlzTWF0Y2g/OiBib29sZWFuO1xyXG4gIGlzSGlkZT86IGJvb2xlYW47XHJcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xyXG4gIGlzQ2hlY2tlZD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICBbcHJvcDogc3RyaW5nXTogYW55O1xyXG5cclxuICBjaGlsZHJlbj86IFtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTWFwIHtcclxuICBbaW5kZXg6IG51bWJlcl06IElUcmVlTm9kZURhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVJdGVtIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIG9wZW4/OiBib29sZWFuO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG4gIGlzTWF0Y2g/OiBib29sZWFuO1xyXG4gIGl0ZW1zPzogSVRyZWVJdGVtW107XHJcbiAgaXNQYXJlbnQ/OiBib29sZWFuO1xyXG4gIGRhdGE/OiBhbnk7XHJcbiAgaWQ/OiBhbnk7XHJcbiAgaXNIaWRlPzogYm9vbGVhbjtcclxuICBpc0FjdGl2ZT86IGJvb2xlYW47XHJcbiAgaXNDaGVja2VkPzogYm9vbGVhbjtcclxuICBoYWxmQ2hlY2tlZD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICBbcHJvcDogc3RyaW5nXTogYW55O1xyXG5cclxuICBkaXNhYmxlQWRkPzogYm9vbGVhbjtcclxuICBkaXNhYmxlRWRpdD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZURlbGV0ZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVJbnB1dCB7XHJcbiAgdHJlZUl0ZW1zOiBBcnJheTxJVHJlZUl0ZW0+O1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHRyZWVOb2RlQ2hpbGRyZW5LZXk/OiBzdHJpbmc7XHJcbiAgdHJlZU5vZGVJZEtleT86IHN0cmluZztcclxuICBjaGVja2JveERpc2FibGVkS2V5Pzogc3RyaW5nO1xyXG4gIHRyZWVOb2RlVGl0bGVLZXk/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUcmVlTm9kZSBpbXBsZW1lbnRzIElUcmVlTm9kZURhdGEge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZCxcclxuICAgIHB1YmxpYyBwYXJlbnRJZCxcclxuICAgIHB1YmxpYyBkYXRhKSB7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHJlZUZhY3Rvcnkge1xyXG4gIG5vZGVzOiBEaWN0aW9uYXJ5PFRyZWVOb2RlPjtcclxuICBwcml2YXRlIGlkeDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2NoZWNrZWQgPSBuZXcgU2V0PE9iamVjdD4oKTtcclxuICBwcml2YXRlIF90cmVlUm9vdDogVHJlZU5vZGVbXSA9IFtdO1xyXG5cclxuICBzdGF0aWMgY3JlYXRlKCkge1xyXG4gICAgcmV0dXJuIG5ldyBUcmVlRmFjdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gdHJlZSBtb2RlbCB3aXRoIGl0ZW1zXHJcbiAgc3RhdGljIGZyb21UcmVlKHtcclxuICAgIHRyZWVJdGVtcyxcclxuICAgIHRyZWVOb2RlQ2hpbGRyZW5LZXkgPSAnaXRlbXMnLFxyXG4gICAgdHJlZU5vZGVJZEtleSA9ICdpZCcsXHJcbiAgICBjaGVja2JveERpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyxcclxuICAgIHRyZWVOb2RlVGl0bGVLZXkgPSAndGl0bGUnXHJcbiAgfTogSVRyZWVJbnB1dCk6IFRyZWVGYWN0b3J5IHtcclxuICAgIGNvbnN0IHRyZWVGYWN0b3J5ID0gVHJlZUZhY3RvcnkuY3JlYXRlKCk7XHJcbiAgICB0cmVlRmFjdG9yeS5tYXBUcmVlSXRlbXMoeyB0cmVlSXRlbXMsIHBhcmVudElkOiB1bmRlZmluZWQsIHRyZWVOb2RlQ2hpbGRyZW5LZXksIHRyZWVOb2RlSWRLZXksIGNoZWNrYm94RGlzYWJsZWRLZXksIHRyZWVOb2RlVGl0bGVLZXkgfSk7XHJcbiAgICByZXR1cm4gdHJlZUZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuaWR4ID0gMDtcclxuICAgIHRoaXMubm9kZXMgPSB7fTtcclxuICB9XHJcblxyXG4gIG1hcFRyZWVJdGVtcyA9ICh7XHJcbiAgICB0cmVlSXRlbXMsXHJcbiAgICBwYXJlbnRJZCxcclxuICAgIHRyZWVOb2RlQ2hpbGRyZW5LZXkgPSAnaXRlbXMnLFxyXG4gICAgdHJlZU5vZGVJZEtleSA9ICdpZCcsXHJcbiAgICBjaGVja2JveERpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyxcclxuICAgIHRyZWVOb2RlVGl0bGVLZXkgPSAndGl0bGUnXHJcbiAgfTogSVRyZWVJbnB1dCkgPT4ge1xyXG4gICAgZm9yRWFjaCh0cmVlSXRlbXMsIChpdGVtOiBJVHJlZUl0ZW0pID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuYWRkTm9kZSh7XHJcbiAgICAgICAgaWQ6IGl0ZW1bdHJlZU5vZGVJZEtleV0sXHJcbiAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgdGl0bGU6IGl0ZW1bdHJlZU5vZGVUaXRsZUtleV0sXHJcbiAgICAgICAgaXNPcGVuOiAhIWl0ZW0ub3BlbixcclxuICAgICAgICBkYXRhOiBpdGVtLmRhdGEgfHwge30sXHJcbiAgICAgICAgb3JpZ2luSXRlbTogaXRlbSxcclxuICAgICAgICBpc1BhcmVudDogISFpdGVtLmlzUGFyZW50IHx8ICEhKGl0ZW1bdHJlZU5vZGVDaGlsZHJlbktleV0gJiYgaXRlbVt0cmVlTm9kZUNoaWxkcmVuS2V5XS5sZW5ndGggPiAwKSxcclxuICAgICAgICBsb2FkaW5nOiAhIWl0ZW0ubG9hZGluZyxcclxuICAgICAgICBpc01hdGNoOiAhIWl0ZW0uaXNNYXRjaCxcclxuICAgICAgICBpc0hpZGU6ICEhaXRlbS5pc0hpZGUsXHJcbiAgICAgICAgaXNDaGVja2VkOiAhIWl0ZW0uaXNDaGVja2VkLFxyXG4gICAgICAgIGhhbGZDaGVja2VkOiAhIWl0ZW0uaGFsZkNoZWNrZWQsXHJcbiAgICAgICAgaXNBY3RpdmU6ICEhaXRlbS5pc0FjdGl2ZSxcclxuICAgICAgICBkaXNhYmxlZDogISFpdGVtW2NoZWNrYm94RGlzYWJsZWRLZXldLFxyXG4gICAgICAgIGRpc2FibGVBZGQ6ICEhaXRlbS5kaXNhYmxlQWRkLFxyXG4gICAgICAgIGRpc2FibGVFZGl0OiAhIWl0ZW0uZGlzYWJsZUVkaXQsXHJcbiAgICAgICAgZGlzYWJsZURlbGV0ZTogISFpdGVtLmRpc2FibGVEZWxldGUsXHJcbiAgICAgICAgY2hpbGRyZW46IFtdXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCEhaXRlbS5pc0NoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9jaGVja2VkLmFkZChub2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5tYXBUcmVlSXRlbXMoe1xyXG4gICAgICAgIHRyZWVJdGVtczogaXRlbVt0cmVlTm9kZUNoaWxkcmVuS2V5XSB8fCBbXSwgcGFyZW50SWQ6IG5vZGUuaWQsIHRyZWVOb2RlQ2hpbGRyZW5LZXksIHRyZWVOb2RlSWRLZXksXHJcbiAgICAgICAgY2hlY2tib3hEaXNhYmxlZEtleSwgdHJlZU5vZGVUaXRsZUtleVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBhZGROb2RlKHsgaWQsIHBhcmVudElkLCAuLi5kYXRhIH06IElUcmVlTm9kZURhdGEpOiBUcmVlTm9kZSB7XHJcbiAgICBpZiAoaXNVbmRlZmluZWQoaWQpKSB7XHJcbiAgICAgIHRoaXMuaWR4Kys7XHJcbiAgICAgIGlkID0gdGhpcy5pZHg7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmVlTm9kZSA9IG5ldyBUcmVlTm9kZShpZCwgcGFyZW50SWQsIGRhdGEpO1xyXG4gICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkodHJlZU5vZGUuaWQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlZCBpZDogJHt0cmVlTm9kZS5pZH0gZGV0ZWN0ZWQsIHBsZWFzZSBzcGVjaWZ5IHVuaXF1ZSBpZHMgaW4gdGhlIHRyZWUuYCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVzID0ge1xyXG4gICAgICAuLi50aGlzLm5vZGVzLFxyXG4gICAgICBbdHJlZU5vZGUuaWRdOiB0cmVlTm9kZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFkZENoaWxkTm9kZSh0aGlzLm5vZGVzW3BhcmVudElkXSwgdHJlZU5vZGUpO1xyXG4gICAgcmV0dXJuIHRyZWVOb2RlO1xyXG4gIH1cclxuXHJcbiAgZWRpdE5vZGVUaXRsZShpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmVkaXRhYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZU5vZGVCeUlkKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2lkXTtcclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLm5vZGVzW25vZGUucGFyZW50SWRdO1xyXG4gICAgdGhpcy5yZW1vdmVDaGlsZE5vZGUocGFyZW50Tm9kZSwgbm9kZSk7XHJcblxyXG4gICAgY29uc3QgZGVsZXRlSXRlbXMgPSAobm9kZUlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbkJ5SWQobm9kZUlkKTtcclxuICAgICAgdGhpcy5ub2RlcyA9IG9taXRCeTxEaWN0aW9uYXJ5PFRyZWVOb2RlPj4odGhpcy5ub2RlcywgKF9ub2RlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIF9ub2RlLmlkID09PSBpZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvckVhY2goY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZUl0ZW1zKGNoaWxkLmlkKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgZGVsZXRlSXRlbXMoaWQpO1xyXG4gICAgaWYgKHBhcmVudE5vZGUgJiYgKCFwYXJlbnROb2RlLmRhdGEuY2hpbGRyZW4gfHwgIXBhcmVudE5vZGUuZGF0YS5jaGlsZHJlbi5sZW5ndGgpKSB7XHJcbiAgICAgIHBhcmVudE5vZGUuZGF0YS5pc1BhcmVudCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVOb2RlQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbiA9ICF0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbjtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb3Blbk5vZGVzQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbiA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5ub2Rlc1tpZF0ucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wZW5Ob2Rlc0J5SWQodGhpcy5ub2Rlc1tpZF0ucGFyZW50SWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVzQnlJZChpZDogbnVtYmVyLCBjbG9zZUNoaWxkcmVuID0gZmFsc2UpIHtcclxuICAgIHRoaXMubm9kZXNbaWRdLmRhdGEuaXNPcGVuID0gZmFsc2U7XHJcbiAgICBpZiAoY2xvc2VDaGlsZHJlbikge1xyXG4gICAgICBpZiAodGhpcy5ub2Rlc1tpZF0gJiYgdGhpcy5ub2Rlc1tpZF0uZGF0YS5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMubm9kZXNbaWRdLmRhdGEuY2hpbGRyZW4uZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZU5vZGVzQnlJZChub2RlLmlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZE5vZGVzQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMubm9kZXNbaWRdLnBhcmVudElkO1xyXG4gICAgdGhpcy5fZGlzYWJsZWRQYXJlbnROb2RlcyhwYXJlbnRJZCk7XHJcblxyXG4gICAgY29uc3QgZGlzYWJsZWROb2RlcyA9IChub2RlSWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5CeUlkKG5vZGVJZCk7XHJcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgIHRoaXMubm9kZXNbY2hpbGQuaWRdLmRhdGEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgZGlzYWJsZWROb2RlcyhjaGlsZC5pZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBkaXNhYmxlZE5vZGVzKGlkKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWRQYXJlbnROb2RlcyhwYXJlbnRJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5CeUlkKHBhcmVudElkKTtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXN1bHQgPSByZWR1Y2UoY2hpbGRyZW4sIChzdGF0dXM6IGJvb2xlYW4sIGNoaWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiBzdGF0dXMgJiYgY2hpbGQuZGF0YS5kaXNhYmxlZDtcclxuICAgIH0sIHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vZGVzW3BhcmVudElkXSkge1xyXG4gICAgICB0aGlzLm5vZGVzW3BhcmVudElkXS5kYXRhLmRpc2FibGVkID0gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tOb2Rlc0J5SWQoaWQ6IG51bWJlciwgY2hlY2tlZDogYm9vbGVhbik6IEFycmF5PE9iamVjdD4ge1xyXG4gICAgdGhpcy5ub2Rlc1tpZF0uZGF0YS5oYWxmQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5ub2Rlc1tpZF0uZGF0YS5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG5cclxuICAgIHRoaXMuY2hlY2tQYXJlbnROb2Rlcyh0aGlzLm5vZGVzW2lkXSk7XHJcbiAgICB0aGlzLmNoZWNrQ2hpbGROb2Rlcyh0aGlzLm5vZGVzW2lkXSwgY2hlY2tlZCk7XHJcbiAgICB0aGlzLm1haW50YWluQ2hlY2tlZE5vZGVMaXN0KHRoaXMubm9kZXNbaWRdLCBjaGVja2VkKTtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWROb2RlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1BhcmVudE5vZGVzKG5vZGU6IFRyZWVOb2RlKSB7XHJcbiAgICBjb25zdCB7IHBhcmVudElkIH0gPSBub2RlO1xyXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMubm9kZXNbcGFyZW50SWRdO1xyXG4gICAgaWYgKHBhcmVudE5vZGUpIHtcclxuICAgICAgY29uc3QgY2hpbGRyZW5Ob2RlID0gdGhpcy5nZXRDaGlsZHJlbkJ5SWQocGFyZW50SWQpO1xyXG4gICAgICBpZiAoY2hpbGRyZW5Ob2RlLmV2ZXJ5KGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUuZGF0YS5pc0NoZWNrZWQgJiYgIWNoaWxkTm9kZS5kYXRhLmhhbGZDaGVja2VkKSkge1xyXG4gICAgICAgIHBhcmVudE5vZGUuZGF0YS5pc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIHBhcmVudE5vZGUuZGF0YS5oYWxmQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuTm9kZS5zb21lKGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUuZGF0YS5oYWxmQ2hlY2tlZCB8fCBjaGlsZE5vZGUuZGF0YS5pc0NoZWNrZWQpKSB7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmlzQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmhhbGZDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJlbnROb2RlLmRhdGEuaXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmhhbGZDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYWludGFpbkNoZWNrZWROb2RlTGlzdChwYXJlbnROb2RlLCBwYXJlbnROb2RlLmRhd