UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

1,112 lines 74.7 kB
/** * @fileoverview added by tsickle * Generated from: tree/nz-tree-base.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { isNotNil } from '../util'; import { NzTreeNode } from './nz-tree-base-node'; import { isCheckDisabled, isInArray } from './nz-tree-base-util'; var NzTreeBaseService = /** @class */ (function () { function NzTreeBaseService() { this.DRAG_SIDE_RANGE = 0.25; this.DRAG_MIN_GAP = 2; this.isCheckStrictly = false; this.isMultiple = false; this.rootNodes = []; this.selectedNodeList = []; this.expandedNodeList = []; this.checkedNodeList = []; this.halfCheckedNodeList = []; this.matchedNodeList = []; this.triggerEventChange$ = new Subject(); } /** * trigger event */ /** * trigger event * @return {?} */ NzTreeBaseService.prototype.eventTriggerChanged = /** * trigger event * @return {?} */ function () { return this.triggerEventChange$.asObservable(); }; /** * reset tree nodes will clear default node list */ /** * reset tree nodes will clear default node list * @param {?} nzNodes * @return {?} */ NzTreeBaseService.prototype.initTree = /** * reset tree nodes will clear default node list * @param {?} nzNodes * @return {?} */ function (nzNodes) { var _this = this; this.rootNodes = nzNodes; this.expandedNodeList = []; this.selectedNodeList = []; this.halfCheckedNodeList = []; this.checkedNodeList = []; this.matchedNodeList = []; // refresh node checked state setTimeout((/** * @return {?} */ function () { _this.refreshCheckState(_this.isCheckStrictly); })); }; /** * @return {?} */ NzTreeBaseService.prototype.getSelectedNode = /** * @return {?} */ function () { return this.selectedNode; }; /** * get some list */ /** * get some list * @return {?} */ NzTreeBaseService.prototype.getSelectedNodeList = /** * get some list * @return {?} */ function () { return this.conductNodeState('select'); }; /** * return checked nodes */ /** * return checked nodes * @return {?} */ NzTreeBaseService.prototype.getCheckedNodeList = /** * return checked nodes * @return {?} */ function () { return this.conductNodeState('check'); }; /** * @return {?} */ NzTreeBaseService.prototype.getHalfCheckedNodeList = /** * @return {?} */ function () { return this.conductNodeState('halfCheck'); }; /** * return expanded nodes */ /** * return expanded nodes * @return {?} */ NzTreeBaseService.prototype.getExpandedNodeList = /** * return expanded nodes * @return {?} */ function () { return this.conductNodeState('expand'); }; /** * return search matched nodes */ /** * return search matched nodes * @return {?} */ NzTreeBaseService.prototype.getMatchedNodeList = /** * return search matched nodes * @return {?} */ function () { return this.conductNodeState('match'); }; // tslint:disable-next-line:no-any // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ NzTreeBaseService.prototype.isArrayOfNzTreeNode = // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ function (value) { return value.every((/** * @param {?} item * @return {?} */ function (item) { return item instanceof NzTreeNode; })); }; /** * reset selectedNodeList */ /** * reset selectedNodeList * @param {?} selectedKeys * @param {?} nzNodes * @param {?=} isMulti * @return {?} */ NzTreeBaseService.prototype.calcSelectedKeys = /** * reset selectedNodeList * @param {?} selectedKeys * @param {?} nzNodes * @param {?=} isMulti * @return {?} */ function (selectedKeys, nzNodes, isMulti) { if (isMulti === void 0) { isMulti = false; } /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { return nodes.every((/** * @param {?} node * @return {?} */ function (node) { if (isInArray(node.key, selectedKeys)) { node.isSelected = true; if (!isMulti) { // if not support multi select return false; } } else { node.isSelected = false; } if (node.children.length > 0) { // Recursion return calc(node.children); } return true; })); }); calc(nzNodes); }; /** * reset expandedNodeList */ /** * reset expandedNodeList * @param {?} expandedKeys * @param {?} nzNodes * @return {?} */ NzTreeBaseService.prototype.calcExpandedKeys = /** * reset expandedNodeList * @param {?} expandedKeys * @param {?} nzNodes * @return {?} */ function (expandedKeys, nzNodes) { this.expandedNodeList = []; /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { nodes.forEach((/** * @param {?} node * @return {?} */ function (node) { node.isExpanded = isInArray(node.key, expandedKeys); if (node.children.length > 0) { calc(node.children); } })); }); calc(nzNodes); }; /** * reset checkedNodeList */ /** * reset checkedNodeList * @param {?} checkedKeys * @param {?} nzNodes * @param {?=} isCheckStrictly * @return {?} */ NzTreeBaseService.prototype.calcCheckedKeys = /** * reset checkedNodeList * @param {?} checkedKeys * @param {?} nzNodes * @param {?=} isCheckStrictly * @return {?} */ function (checkedKeys, nzNodes, isCheckStrictly) { if (isCheckStrictly === void 0) { isCheckStrictly = false; } this.checkedNodeList = []; this.halfCheckedNodeList = []; /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { nodes.forEach((/** * @param {?} node * @return {?} */ function (node) { if (isInArray(node.key, checkedKeys)) { node.isChecked = true; node.isHalfChecked = false; } else { node.isChecked = false; node.isHalfChecked = false; } if (node.children.length > 0) { calc(node.children); } })); }); calc(nzNodes); // controlled state this.refreshCheckState(isCheckStrictly); }; /** * set drag node */ /** * set drag node * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setSelectedNode = /** * set drag node * @param {?} node * @return {?} */ function (node) { this.selectedNode = node; }; /** * set node selected status */ /** * set node selected status * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setNodeActive = /** * set node selected status * @param {?} node * @return {?} */ function (node) { if (!this.isMultiple && node.isSelected) { this.selectedNodeList.forEach((/** * @param {?} n * @return {?} */ function (n) { if (node.key !== n.key) { // reset other nodes n.isSelected = false; } })); // single mode: remove pre node this.selectedNodeList = []; } this.setSelectedNodeList(node, this.isMultiple); }; /** * add or remove node to selectedNodeList */ /** * add or remove node to selectedNodeList * @param {?} node * @param {?=} isMultiple * @return {?} */ NzTreeBaseService.prototype.setSelectedNodeList = /** * add or remove node to selectedNodeList * @param {?} node * @param {?=} isMultiple * @return {?} */ function (node, isMultiple) { if (isMultiple === void 0) { isMultiple = false; } /** @type {?} */ var index = this.selectedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (isMultiple) { if (node.isSelected && index === -1) { this.selectedNodeList.push(node); } } else { if (node.isSelected && index === -1) { this.selectedNodeList = [node]; } } if (!node.isSelected) { this.selectedNodeList = this.selectedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); } }; /** * merge checked nodes */ /** * merge checked nodes * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setHalfCheckedNodeList = /** * merge checked nodes * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var index = this.halfCheckedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isHalfChecked && index === -1) { this.halfCheckedNodeList.push(node); } else if (!node.isHalfChecked && index > -1) { this.halfCheckedNodeList = this.halfCheckedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setCheckedNodeList = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var index = this.checkedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isChecked && index === -1) { this.checkedNodeList.push(node); } else if (!node.isChecked && index > -1) { this.checkedNodeList = this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * conduct checked/selected/expanded keys */ /** * conduct checked/selected/expanded keys * @param {?=} type * @return {?} */ NzTreeBaseService.prototype.conductNodeState = /** * conduct checked/selected/expanded keys * @param {?=} type * @return {?} */ function (type) { var _this = this; if (type === void 0) { type = 'check'; } /** @type {?} */ var resultNodesList = []; switch (type) { case 'select': resultNodesList = this.selectedNodeList; break; case 'expand': resultNodesList = this.expandedNodeList; break; case 'match': resultNodesList = this.matchedNodeList; break; case 'check': resultNodesList = this.checkedNodeList; /** @type {?} */ var isIgnore_1 = (/** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { if (_this.checkedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return n.key === parentNode.key; })) > -1) { return true; } else { return isIgnore_1(parentNode); } } return false; }); // merge checked if (!this.isCheckStrictly) { resultNodesList = this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return !isIgnore_1(n); })); } break; case 'halfCheck': if (!this.isCheckStrictly) { resultNodesList = this.halfCheckedNodeList; } break; } return resultNodesList; }; /** * set expanded nodes */ /** * set expanded nodes * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setExpandedNodeList = /** * set expanded nodes * @param {?} node * @return {?} */ function (node) { if (node.isLeaf) { return; } /** @type {?} */ var index = this.expandedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isExpanded && index === -1) { this.expandedNodeList.push(node); } else if (!node.isExpanded && index > -1) { this.expandedNodeList = this.expandedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * check state * @param isCheckStrictly */ /** * check state * @param {?=} isCheckStrictly * @return {?} */ NzTreeBaseService.prototype.refreshCheckState = /** * check state * @param {?=} isCheckStrictly * @return {?} */ function (isCheckStrictly) { var _this = this; if (isCheckStrictly === void 0) { isCheckStrictly = false; } if (isCheckStrictly) { return; } this.checkedNodeList.forEach((/** * @param {?} node * @return {?} */ function (node) { _this.conduct(node); })); }; // reset other node checked state based current node // reset other node checked state based current node /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.conduct = // reset other node checked state based current node /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var isChecked = node.isChecked; if (node) { this.conductUp(node); this.conductDown(node, isChecked); } }; /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked */ /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked * @param {?} node * @return {?} */ NzTreeBaseService.prototype.conductUp = /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { if (!isCheckDisabled(parentNode)) { if (parentNode.children.every((/** * @param {?} child * @return {?} */ function (child) { return isCheckDisabled(child) || (!child.isHalfChecked && child.isChecked); }))) { parentNode.isChecked = true; parentNode.isHalfChecked = false; } else if (parentNode.children.some((/** * @param {?} child * @return {?} */ function (child) { return child.isHalfChecked || child.isChecked; }))) { parentNode.isChecked = false; parentNode.isHalfChecked = true; } else { parentNode.isChecked = false; parentNode.isHalfChecked = false; } } this.setCheckedNodeList(parentNode); this.setHalfCheckedNodeList(parentNode); this.conductUp(parentNode); } }; /** * reset child check state */ /** * reset child check state * @param {?} node * @param {?} value * @return {?} */ NzTreeBaseService.prototype.conductDown = /** * reset child check state * @param {?} node * @param {?} value * @return {?} */ function (node, value) { var _this = this; if (!isCheckDisabled(node)) { node.isChecked = value; node.isHalfChecked = false; this.setCheckedNodeList(node); this.setHalfCheckedNodeList(node); node.children.forEach((/** * @param {?} n * @return {?} */ function (n) { _this.conductDown(n, value); })); } }; /** * search value & expand node * should add expandlist */ /** * search value & expand node * should add expandlist * @param {?} value * @return {?} */ NzTreeBaseService.prototype.searchExpand = /** * search value & expand node * should add expandlist * @param {?} value * @return {?} */ function (value) { var _this = this; this.matchedNodeList = []; /** @type {?} */ var expandedKeys = []; if (!isNotNil(value)) { return; } // to reset expandedNodeList /** @type {?} */ var expandParent = (/** * @param {?} n * @return {?} */ function (n) { // expand parent node /** @type {?} */ var parentNode = n.getParentNode(); if (parentNode) { expandedKeys.push(parentNode.key); expandParent(parentNode); } }); /** @type {?} */ var searchChild = (/** * @param {?} n * @return {?} */ function (n) { if (value && n.title.includes(value)) { // match the node n.isMatched = true; _this.matchedNodeList.push(n); // expand parentNode expandParent(n); } else { n.isMatched = false; } n.canHide = !n.isMatched; n.children.forEach((/** * @param {?} child * @return {?} */ function (child) { searchChild(child); })); }); this.rootNodes.forEach((/** * @param {?} child * @return {?} */ function (child) { searchChild(child); })); // expand matched keys this.calcExpandedKeys(expandedKeys, this.rootNodes); }; /** * flush after delete node */ /** * flush after delete node * @param {?} nodes * @return {?} */ NzTreeBaseService.prototype.afterRemove = /** * flush after delete node * @param {?} nodes * @return {?} */ function (nodes) { var _this = this; // to reset selectedNodeList & expandedNodeList /** @type {?} */ var loopNode = (/** * @param {?} node * @return {?} */ function (node) { // remove selected node _this.selectedNodeList = _this.selectedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); // remove expanded node _this.expandedNodeList = _this.expandedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); // remove checked node _this.checkedNodeList = _this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); if (node.children) { node.children.forEach((/** * @param {?} child * @return {?} */ function (child) { loopNode(child); })); } }); nodes.forEach((/** * @param {?} n * @return {?} */ function (n) { loopNode(n); })); this.refreshCheckState(this.isCheckStrictly); }; /** * drag event */ /** * drag event * @param {?} node * @return {?} */ NzTreeBaseService.prototype.refreshDragNode = /** * drag event * @param {?} node * @return {?} */ function (node) { var _this = this; if (node.children.length === 0) { // until root this.conductUp(node); } else { node.children.forEach((/** * @param {?} child * @return {?} */ function (child) { _this.refreshDragNode(child); })); } }; // reset node level // reset node level /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.resetNodeLevel = // reset node level /** * @param {?} node * @return {?} */ function (node) { var e_1, _a; /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { node.level = parentNode.level + 1; } else { node.level = 0; } try { for (var _b = tslib_1.__values(node.children), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; this.resetNodeLevel(child); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * @param {?} event * @return {?} */ NzTreeBaseService.prototype.calcDropPosition = /** * @param {?} event * @return {?} */ function (event) { var clientY = event.clientY; // to fix firefox undefined var _a = event.srcElement ? ((/** @type {?} */ (event.srcElement))).getBoundingClientRect() : ((/** @type {?} */ (event.target))).getBoundingClientRect(), top = _a.top, bottom = _a.bottom, height = _a.height; /** @type {?} */ var des = Math.max(height * this.DRAG_SIDE_RANGE, this.DRAG_MIN_GAP); if (clientY <= top + des) { return -1; } else if (clientY >= bottom - des) { return 1; } return 0; }; /** * drop * 0: inner -1: pre 1: next */ /** * drop * 0: inner -1: pre 1: next * @param {?} targetNode * @param {?=} dragPos * @return {?} */ NzTreeBaseService.prototype.dropAndApply = /** * drop * 0: inner -1: pre 1: next * @param {?} targetNode * @param {?=} dragPos * @return {?} */ function (targetNode, dragPos) { var _this = this; if (dragPos === void 0) { dragPos = -1; } if (!targetNode || dragPos > 1) { return; } /** @type {?} */ var treeService = targetNode.treeService; /** @type {?} */ var targetParent = targetNode.getParentNode(); /** @type {?} */ var isSelectedRootNode = this.selectedNode.getParentNode(); // remove the dragNode if (isSelectedRootNode) { isSelectedRootNode.children = isSelectedRootNode.children.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== _this.selectedNode.key; })); } else { this.rootNodes = this.rootNodes.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== _this.selectedNode.key; })); } switch (dragPos) { case 0: targetNode.addChildren([this.selectedNode]); this.resetNodeLevel(targetNode); break; case -1: case 1: /** @type {?} */ var tIndex = dragPos === 1 ? 1 : 0; if (targetParent) { targetParent.addChildren([this.selectedNode], targetParent.children.indexOf(targetNode) + tIndex); /** @type {?} */ var parentNode = this.selectedNode.getParentNode(); if (parentNode) { this.resetNodeLevel(parentNode); } } else { /** @type {?} */ var targetIndex = this.rootNodes.indexOf(targetNode) + tIndex; // Insert root node. this.rootNodes.splice(targetIndex, 0, this.selectedNode); this.rootNodes[targetIndex].parentNode = null; this.rootNodes[targetIndex].level = 0; } break; } // flush all nodes this.rootNodes.forEach((/** * @param {?} child * @return {?} */ function (child) { if (!child.treeService) { child.service = treeService; } _this.refreshDragNode(child); })); }; /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode */ /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode * @param {?} eventName * @param {?} node * @param {?} event * @return {?} */ NzTreeBaseService.prototype.formatEvent = /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode * @param {?} eventName * @param {?} node * @param {?} event * @return {?} */ function (eventName, node, event) { /** @type {?} */ var emitStructure = { eventName: eventName, node: node, event: event }; switch (eventName) { case 'dragstart': case 'dragenter': case 'dragover': case 'dragleave': case 'drop': case 'dragend': Object.assign(emitStructure, { dragNode: this.getSelectedNode() }); break; case 'click': case 'dblclick': Object.assign(emitStructure, { selectedKeys: this.selectedNodeList }); Object.assign(emitStructure, { nodes: this.selectedNodeList }); Object.assign(emitStructure, { keys: this.selectedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'check': /** @type {?} */ var checkedNodeList = this.getCheckedNodeList(); Object.assign(emitStructure, { checkedKeys: checkedNodeList }); Object.assign(emitStructure, { nodes: checkedNodeList }); Object.assign(emitStructure, { keys: checkedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'search': Object.assign(emitStructure, { matchedKeys: this.getMatchedNodeList() }); Object.assign(emitStructure, { nodes: this.getMatchedNodeList() }); Object.assign(emitStructure, { keys: this.getMatchedNodeList().map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'expand': Object.assign(emitStructure, { nodes: this.expandedNodeList }); Object.assign(emitStructure, { keys: this.expandedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; } return emitStructure; }; /** * @return {?} */ NzTreeBaseService.prototype.ngOnDestroy = /** * @return {?} */ function () { this.triggerEventChange$.complete(); }; NzTreeBaseService.decorators = [ { type: Injectable } ]; return NzTreeBaseService; }()); export { NzTreeBaseService }; if (false) { /** @type {?} */ NzTreeBaseService.prototype.DRAG_SIDE_RANGE; /** @type {?} */ NzTreeBaseService.prototype.DRAG_MIN_GAP; /** @type {?} */ NzTreeBaseService.prototype.isCheckStrictly; /** @type {?} */ NzTreeBaseService.prototype.isMultiple; /** @type {?} */ NzTreeBaseService.prototype.selectedNode; /** @type {?} */ NzTreeBaseService.prototype.rootNodes; /** @type {?} */ NzTreeBaseService.prototype.selectedNodeList; /** @type {?} */ NzTreeBaseService.prototype.expandedNodeList; /** @type {?} */ NzTreeBaseService.prototype.checkedNodeList; /** @type {?} */ NzTreeBaseService.prototype.halfCheckedNodeList; /** @type {?} */ NzTreeBaseService.prototype.matchedNodeList; /** @type {?} */ NzTreeBaseService.prototype.triggerEventChange$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotdHJlZS1iYXNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvIiwic291cmNlcyI6WyJ0cmVlL256LXRyZWUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRTtJQUFBO1FBRUUsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFFakIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QixjQUFTLEdBQWlCLEVBQUUsQ0FBQztRQUM3QixxQkFBZ0IsR0FBaUIsRUFBRSxDQUFDO1FBQ3BDLHFCQUFnQixHQUFpQixFQUFFLENBQUM7UUFDcEMsb0JBQWUsR0FBaUIsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFpQixFQUFFLENBQUM7UUFDdkMsb0JBQWUsR0FBaUIsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO0lBNmdCekQsQ0FBQztJQTNnQkM7O09BRUc7Ozs7O0lBQ0gsK0NBQW1COzs7O0lBQW5CO1FBQ0UsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSCxvQ0FBUTs7Ozs7SUFBUixVQUFTLE9BQXFCO1FBQTlCLGlCQVdDO1FBVkMsSUFBSSxDQUFDLFNBQVMsR0FB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