UNPKG

@recruitler/drag-drop

Version:

A forked version of Angular/'s drag-drop CDK.

161 lines 22.9 kB
import { transferArrayItem } from "./drag-utils"; export function getParent(roots, children) { for (const root of roots) { if (root.children) { if (root.children == children) return root; else { const parent = root.children.length > 0 ? getParent(root.children, children) : undefined; if (parent !== undefined) return parent; } } } return undefined; } export function getDecendantCount(parent) { let count = 1; if (parent.children && parent.children.length > 0) { for (let child of parent.children) { count += getDecendantCount(child); } } return count; } export function getTotalCount(parents) { let count = 0; for (const parent of parents) { count += getDecendantCount(parent); } return count; } export function buildTree(children) { return { _isEmpty: true, children }; } export function constructCdkIndexTree(rootNode) { const root = _constructCdkIndexTreeNode(rootNode, -1).indexNode; const dropItems = []; const itemCount = getDecendantCount(rootNode) - 1; for (let i = 0; i < itemCount; i++) dropItems.push(rootNode); _traverseCdkIndexTree(root, (node) => { if (node.indexOfList !== -1) dropItems[node.indexOfList] = node.itemOfList; }); return { root, dropItems }; } function _traverseCdkIndexTree(root, cb) { cb(root); if (root.children && root.children.length > 0) { for (let child of root.children) { _traverseCdkIndexTree(child, cb); } } } function _getCdkIndexTreeNode(root, index) { let node; if (root.indexOfList == index) return root; if (root.children && root.children.length > 0) { for (let child of root.children) { if (node = _getCdkIndexTreeNode(child, index)) { return node; } } } return undefined; } function _constructCdkIndexTreeNode(node, index, parent) { let indexNode = { indexOfList: index, itemOfList: node, parent: parent, }; index++; if (node.children && node.children.length > 0) { let children = []; for (let child of node.children) { const { indexNode: childIndexNode, index: newIndex } = _constructCdkIndexTreeNode(child, index, indexNode); children.push(childIndexNode); index = newIndex; } indexNode.children = children; } return { indexNode, index }; } // export function getIndexOfNode(tree : CdkDropDownItem[], ) { // } export function splitTree(tree, startIndex, endIndex) { return _splitTree(tree.root, startIndex, endIndex).newDropItem; } function _splitTree(node, startIndex, endIndex) { const children = node.children; // const newDropItem = Object.assign(node.itemOfList); let newDropItem = {}; let newDropChildren = []; let hasReached = false; if (node.indexOfList < startIndex || node.indexOfList > endIndex) newDropItem["_isEmpty"] = true; else newDropItem = Object.assign({}, node.itemOfList, { children: undefined }); if (node.indexOfList == endIndex) { return { newDropItem, hasReached: true }; } if (children && children.length > 0) { for (let index = 0; index < children.length; index++) { const child = children[index]; if (index < children.length - 1 && startIndex >= children[index + 1].indexOfList) continue; if (endIndex < child.indexOfList) continue; const { newDropItem: subtree, hasReached: reached } = _splitTree(child, startIndex, endIndex); newDropChildren.push(subtree); hasReached = reached; if (hasReached) { break; } } ; } if (newDropChildren.length > 0) newDropItem.children = newDropChildren; return { newDropItem, hasReached }; } export function swapTreeNodes(tree, sourceIndex, targetIndex) { const sourceNode = _getCdkIndexTreeNode(tree.root, sourceIndex); const targetNode = _getCdkIndexTreeNode(tree.root, targetIndex); if (sourceNode && targetNode) { let sourceChildren = sourceNode.parent?.itemOfList.children; let targetChildren = targetNode.parent?.itemOfList.children; if (sourceChildren && targetChildren) { let sourceChildIndex = sourceChildren.indexOf(sourceNode.itemOfList); let targetChildIndex = targetChildren.indexOf(targetNode.itemOfList); sourceChildIndex >= 0 && targetChildIndex >= 0 && transferArrayItem(sourceChildren, targetChildren, sourceChildIndex, targetChildIndex); } } } export function nestTreeNode(tree, sourceIndex, nestIndex) { const sourceNode = _getCdkIndexTreeNode(tree.root, sourceIndex); const targetNode = _getCdkIndexTreeNode(tree.root, nestIndex); if (sourceNode && targetNode) { let sourceChildren = sourceNode.parent?.itemOfList.children; if (sourceChildren) { let sourceChildIndex = sourceChildren.indexOf(sourceNode.itemOfList); // sourceChildIndex >= 0 && targetChildIndex >= 0 && transferArrayItem(sourceChildren, targetChildren, sourceChildIndex, targetChildIndex); const targetItem = targetNode.itemOfList; let targetChildren = targetItem.children ? targetItem.children : []; transferArrayItem(sourceChildren, targetChildren, sourceChildIndex, targetChildren.length); targetItem.children = targetChildren; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zb3J0YWJsZS9zcmMvbGliL2RyYWctZHJvcC9kcmFnLWRyb3AtdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUF3QmpELE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBd0IsRUFBRSxRQUEyQjtJQUMzRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFLLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUTtnQkFDMUIsT0FBTyxJQUFJLENBQUM7aUJBQ1g7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMxRixJQUFJLE1BQU0sS0FBSyxTQUFTO29CQUNwQixPQUFPLE1BQU0sQ0FBQTthQUNwQjtTQUNKO0tBQ0o7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXVCO0lBQ3JELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVkLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDL0MsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQy9CLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztLQUNKO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsT0FB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Y0FBYyxFQUNkLGdCQUFnQixFQUNoQixjQUFjLENBQUMsTUFBTSxDQUN4QixDQUFDO1lBQ0YsVUFBVSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7U0FDeEM7S0FDSjtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gXCIuL2RyYWctdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDZGtEcm9wRG93bkl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gYSBDZGtEcm9wRG93bkl0ZW0gd2lsbCBiZSBhbiB1bmtub3duIGRhdGEgbW9kZWxcbiAgICBjaGlsZHJlbj86IENka0Ryb3BEb3duSXRlbVtdOyAvLyB3ZSBjYW4gcmVxdWlyZSBgY2hpbGRyZW5bXWBcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENka0luZGV4VHJlZSB7XG4gICAgcm9vdDogQ2RrSW5kZXhUcmVlTm9kZSxcbiAgICBkcm9wSXRlbXM6IENka0Ryb3BEb3duSXRlbVtdLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0luZGV4VHJlZU5vZGUge1xuXG4gICAgcGFyZW50PzogQ2RrSW5kZXhUcmVlTm9kZSxcblxuICAgIGl0ZW1PZkxpc3Q6IENka0Ryb3BEb3duSXRlbSxcblxuICAgIGluZGV4T2ZMaXN0OiBudW1iZXIsXG5cbiAgICBjaGlsZHJlbj86IENka0luZGV4VHJlZU5vZGVbXSxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudChyb290czogQ2RrRHJvcERvd25JdGVtW10sIGNoaWxkcmVuOiBDZGtEcm9wRG93bkl0ZW1bXSk6IENka0Ryb3BEb3duSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XG4gICAgICAgIGlmIChyb290LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoIHJvb3QuY2hpbGRyZW4gPT0gY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSByb290LmNoaWxkcmVuLmxlbmd0aCA+IDAgPyAgZ2V0UGFyZW50KHJvb3QuY2hpbGRyZW4sIGNoaWxkcmVuKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVjZW5kYW50Q291bnQocGFyZW50OiBDZGtEcm9wRG93bkl0ZW0pOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICBpZiAocGFyZW50LmNoaWxkcmVuICYmIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHBhcmVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgY291bnQgKz0gZ2V0RGVjZW5kYW50Q291bnQoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG90YWxDb3VudChwYXJlbnRzOiBDZGtEcm9wRG93bkl0ZW1bXSk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzKSB7XG4gICAgICAgIGNvdW50ICs9IGdldERlY2VuZGFudENvdW50KHBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUcmVlKGNoaWxkcmVuOiBDZGtEcm9wRG93bkl0ZW1bXSk6IENka0Ryb3BEb3duSXRlbSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgX2lzRW1wdHk6IHRydWUsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0Q2RrSW5kZXhUcmVlKHJvb3ROb2RlOiBDZGtEcm9wRG93bkl0ZW0pOiBDZGtJbmRleFRyZWUge1xuICAgIGNvbnN0IHJvb3QgPSBfY29uc3RydWN0Q2RrSW5kZXhUcmVlTm9kZShyb290Tm9kZSwgLTEpLmluZGV4Tm9kZTtcblxuICAgIGNvbnN0IGRyb3BJdGVtcyA9IFtdO1xuXG4gICAgY29uc3QgaXRlbUNvdW50ID0gZ2V0RGVjZW5kYW50Q291bnQocm9vdE5vZGUpIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspXG4gICAgICAgIGRyb3BJdGVtcy5wdXNoKHJvb3ROb2RlKTtcblxuXG4gICAgX3RyYXZlcnNlQ2RrSW5kZXhUcmVlKHJvb3QsIChub2RlOiBDZGtJbmRleFRyZWVOb2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlLmluZGV4T2ZMaXN0ICE9PSAtMSlcbiAgICAgICAgICAgIGRyb3BJdGVtc1tub2RlLmluZGV4T2ZMaXN0XSA9IG5vZGUuaXRlbU9mTGlzdDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGRyb3BJdGVtc1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX3RyYXZlcnNlQ2RrSW5kZXhUcmVlKHJvb3Q6IENka0luZGV4VHJlZU5vZGUsIGNiOiAobm9kZTogQ2RrSW5kZXhUcmVlTm9kZSkgPT4gdm9pZCkge1xuXG4gICAgY2Iocm9vdCk7XG4gICAgaWYgKHJvb3QuY2hpbGRyZW4gJiYgcm9vdC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHJvb3QuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIF90cmF2ZXJzZUNka0luZGV4VHJlZShjaGlsZCwgY2IpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0Q2RrSW5kZXhUcmVlTm9kZShyb290OiBDZGtJbmRleFRyZWVOb2RlLCBpbmRleDogbnVtYmVyKTogQ2RrSW5kZXhUcmVlTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG5vZGU6IENka0luZGV4VHJlZU5vZGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJvb3QuaW5kZXhPZkxpc3QgPT0gaW5kZXgpXG4gICAgICAgIHJldHVybiByb290O1xuXG4gICAgaWYgKHJvb3QuY2hpbGRyZW4gJiYgcm9vdC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHJvb3QuY2hpbGRyZW4pIHtcblxuICAgICAgICAgICAgaWYgKG5vZGUgPSBfZ2V0Q2RrSW5kZXhUcmVlTm9kZShjaGlsZCwgaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0Q2RrSW5kZXhUcmVlTm9kZShub2RlOiBDZGtEcm9wRG93bkl0ZW0sIGluZGV4OiBudW1iZXIsIHBhcmVudD86IENka0luZGV4VHJlZU5vZGUpOiB7IGluZGV4Tm9kZTogQ2RrSW5kZXhUcmVlTm9kZSwgaW5kZXg6IG51bWJlciB9IHtcbiAgICBsZXQgaW5kZXhOb2RlOiBDZGtJbmRleFRyZWVOb2RlID0ge1xuICAgICAgICBpbmRleE9mTGlzdDogaW5kZXgsXG4gICAgICAgIGl0ZW1PZkxpc3Q6IG5vZGUsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgIH1cblxuICAgIGluZGV4Kys7XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuOiBDZGtJbmRleFRyZWVOb2RlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCB7IGluZGV4Tm9kZTogY2hpbGRJbmRleE5vZGUsIGluZGV4OiBuZXdJbmRleCB9ID0gX2NvbnN0cnVjdENka0luZGV4VHJlZU5vZGUoY2hpbGQsIGluZGV4LCBpbmRleE5vZGUpO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZEluZGV4Tm9kZSk7XG4gICAgICAgICAgICBpbmRleCA9IG5ld0luZGV4O1xuXG4gICAgICAgIH1cblxuICAgICAgICBpbmRleE5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE5vZGUsXG4gICAgICAgIGluZGV4XG4gICAgfTtcblxufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhPZk5vZGUodHJlZSA6IENka0Ryb3BEb3duSXRlbVtdLCApIHtcblxuLy8gfVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRUcmVlKHRyZWU6IENka0luZGV4VHJlZSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogQ2RrRHJvcERvd25JdGVtIHtcblxuXG4gICAgcmV0dXJuIF9zcGxpdFRyZWUodHJlZS5yb290LCBzdGFydEluZGV4LCBlbmRJbmRleCkubmV3RHJvcEl0ZW07XG5cbn1cblxuZnVuY3Rpb24gX3NwbGl0VHJlZShub2RlOiBDZGtJbmRleFRyZWVOb2RlLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB7IG5ld0Ryb3BJdGVtOiBDZGtEcm9wRG93bkl0ZW0sIGhhc1JlYWNoZWQ6IGJvb2xlYW4gfSB7XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG5cbiAgICAvLyBjb25zdCBuZXdEcm9wSXRlbSA9IE9iamVjdC5hc3NpZ24obm9kZS5pdGVtT2ZMaXN0KTtcbiAgICBsZXQgbmV3RHJvcEl0ZW06IENka0Ryb3BEb3duSXRlbSA9IHt9O1xuXG4gICAgbGV0IG5ld0Ryb3BDaGlsZHJlbjogQ2RrRHJvcERvd25JdGVtW10gPSBbXTtcblxuICAgIGxldCBoYXNSZWFjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAobm9kZS5pbmRleE9mTGlzdCA8IHN0YXJ0SW5kZXggfHwgbm9kZS5pbmRleE9mTGlzdCA+IGVuZEluZGV4KVxuICAgICAgICBuZXdEcm9wSXRlbVtcIl9pc0VtcHR5XCJdID0gdHJ1ZTtcbiAgICBlbHNlXG4gICAgICAgIG5ld0Ryb3BJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZS5pdGVtT2ZMaXN0LCB7IGNoaWxkcmVuOiB1bmRlZmluZWQgfSk7XG5cblxuICAgIGlmIChub2RlLmluZGV4T2ZMaXN0ID09IGVuZEluZGV4KSB7XG4gICAgICAgIHJldHVybiB7IG5ld0Ryb3BJdGVtLCBoYXNSZWFjaGVkOiB0cnVlIH07XG4gICAgfVxuXG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgc3RhcnRJbmRleCA+PSBjaGlsZHJlbltpbmRleCArIDFdLmluZGV4T2ZMaXN0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoZW5kSW5kZXggPCBjaGlsZC5pbmRleE9mTGlzdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgeyBuZXdEcm9wSXRlbTogc3VidHJlZSwgaGFzUmVhY2hlZDogcmVhY2hlZCB9ID0gX3NwbGl0VHJlZShjaGlsZCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuXG4gICAgICAgICAgICBuZXdEcm9wQ2hpbGRyZW4ucHVzaChzdWJ0cmVlKTtcblxuICAgICAgICAgICAgaGFzUmVhY2hlZCA9IHJlYWNoZWQ7XG5cbiAgICAgICAgICAgIGlmIChoYXNSZWFjaGVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICB9O1xuXG4gICAgfVxuXG4gICAgaWYgKG5ld0Ryb3BDaGlsZHJlbi5sZW5ndGggPiAwKVxuICAgICAgICBuZXdEcm9wSXRlbS5jaGlsZHJlbiA9IG5ld0Ryb3BDaGlsZHJlbjtcblxuICAgIHJldHVybiB7IG5ld0Ryb3BJdGVtLCBoYXNSZWFjaGVkIH07XG5cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3dhcFRyZWVOb2Rlcyh0cmVlOiBDZGtJbmRleFRyZWUsIHNvdXJjZUluZGV4OiBudW1iZXIsIHRhcmdldEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzb3VyY2VOb2RlID0gX2dldENka0luZGV4VHJlZU5vZGUodHJlZS5yb290LCBzb3VyY2VJbmRleCk7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IF9nZXRDZGtJbmRleFRyZWVOb2RlKHRyZWUucm9vdCwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSkge1xuXG5cbiAgICAgICAgbGV0IHNvdXJjZUNoaWxkcmVuID0gc291cmNlTm9kZS5wYXJlbnQ/Lml0ZW1PZkxpc3QuY2hpbGRyZW47XG4gICAgICAgIGxldCB0YXJnZXRDaGlsZHJlbiA9IHRhcmdldE5vZGUucGFyZW50Py5pdGVtT2ZMaXN0LmNoaWxkcmVuO1xuXG5cbiAgICAgICAgaWYgKHNvdXJjZUNoaWxkcmVuICYmIHRhcmdldENoaWxkcmVuKSB7XG5cblxuXG4gICAgICAgICAgICBsZXQgc291cmNlQ2hpbGRJbmRleCA9IHNvdXJjZUNoaWxkcmVuLmluZGV4T2Yoc291cmNlTm9kZS5pdGVtT2ZMaXN0KTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRDaGlsZEluZGV4ID0gdGFyZ2V0Q2hpbGRyZW4uaW5kZXhPZih0YXJnZXROb2RlLml0ZW1PZkxpc3QpO1xuXG5cblxuICAgICAgICAgICAgc291cmNlQ2hpbGRJbmRleCA+PSAwICYmIHRhcmdldENoaWxkSW5kZXggPj0gMCAmJiB0cmFuc2ZlckFycmF5SXRlbShzb3VyY2VDaGlsZHJlbiwgdGFyZ2V0Q2hpbGRyZW4sIHNvdXJjZUNoaWxkSW5kZXgsIHRhcmdldENoaWxkSW5kZXgpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lc3RUcmVlTm9kZSh0cmVlOiBDZGtJbmRleFRyZWUsIHNvdXJjZUluZGV4OiBudW1iZXIsIG5lc3RJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc291cmNlTm9kZSA9IF9nZXRDZGtJbmRleFRyZWVOb2RlKHRyZWUucm9vdCwgc291cmNlSW5kZXgpO1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBfZ2V0Q2RrSW5kZXhUcmVlTm9kZSh0cmVlLnJvb3QsIG5lc3RJbmRleCk7XG5cbiAgICBpZiAoc291cmNlTm9kZSAmJiB0YXJnZXROb2RlKSB7XG5cblxuICAgICAgICBsZXQgc291cmNlQ2hpbGRyZW4gPSBzb3VyY2VOb2RlLnBhcmVudD8uaXRlbU9mTGlzdC5jaGlsZHJlbjtcblxuICAgICAgICBpZiAoc291cmNlQ2hpbGRyZW4pIHtcblxuXG5cbiAgICAgICAgICAgIGxldCBzb3VyY2VDaGlsZEluZGV4ID0gc291cmNlQ2hpbGRyZW4uaW5kZXhPZihzb3VyY2VOb2RlLml0ZW1PZkxpc3QpO1xuXG4gICAgICAgICAgICAvLyBzb3VyY2VDaGlsZEluZGV4ID49IDAgJiYgdGFyZ2V0Q2hpbGRJbmRleCA+PSAwICYmIHRyYW5zZmVyQXJyYXlJdGVtKHNvdXJjZUNoaWxkcmVuLCB0YXJnZXRDaGlsZHJlbiwgc291cmNlQ2hpbGRJbmRleCwgdGFyZ2V0Q2hpbGRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGFyZ2V0Tm9kZS5pdGVtT2ZMaXN0O1xuICAgICAgICAgICAgbGV0IHRhcmdldENoaWxkcmVuID0gdGFyZ2V0SXRlbS5jaGlsZHJlbiA/IHRhcmdldEl0ZW0uY2hpbGRyZW4gOiBbXTtcblxuICAgICAgICAgICAgdHJhbnNmZXJBcnJheUl0ZW0oXG4gICAgICAgICAgICAgICAgc291cmNlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgc291cmNlQ2hpbGRJbmRleCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXJnZXRJdGVtLmNoaWxkcmVuID0gdGFyZ2V0Q2hpbGRyZW47XG4gICAgICAgIH1cbiAgICB9XG59Il19