UNPKG

@dcl-sdk/utils

Version:

A collection of helpers to make it easier to build a Decentraland scene using the SDK 7.

331 lines 37.3 kB
import { priority } from './priority'; export var actions; (function (actions) { class SequenceRunner { constructor(targetEngine, sequenceBuilt, onFinishCallback) { this.beginSequenceNode = null; this.currentSequenceNode = null; this.running = false; this.started = false; this.engine = targetEngine; this.systemFn = (dt) => { this.update(dt); }; this.engine.addSystem(this.systemFn, priority.ActionSystemPriority); if (sequenceBuilt) { this.startSequence(sequenceBuilt); } if (onFinishCallback) this.setOnFinishCallback(onFinishCallback); } startSequence(sequenceBuilt) { this.beginSequenceNode = sequenceBuilt.beginSequenceNode; this.currentSequenceNode = this.beginSequenceNode; this.running = true; this.started = false; } destroy() { this.engine.removeSystem(this.systemFn); } setOnFinishCallback(onFinishCallback) { this.onFinishCallback = onFinishCallback; } isRunning() { return this.running; } stop() { this.running = false; } resume() { if (this.beginSequenceNode != null) this.running = true; } reset() { this.currentSequenceNode = this.beginSequenceNode; this.running = true; this.started = false; } getRunningAction() { let currentNode = this.currentSequenceNode; if (this.currentSequenceNode instanceof SubSequenceNode) { do { currentNode = currentNode.currentInnerSequence; } while (currentNode instanceof SubSequenceNode); } return currentNode.action; } update(dt) { if (!this.running) return; if (!this.started) { this.currentSequenceNode.onStart(); this.started = true; return; } if (!this.currentSequenceNode.hasFinish()) { this.currentSequenceNode.update(dt); return; } this.currentSequenceNode.onFinish(); this.currentSequenceNode = this.currentSequenceNode.next; if (this.currentSequenceNode) { this.currentSequenceNode.onStart(); } else { this.running = false; if (this.onFinishCallback) this.onFinishCallback(); } } } actions.SequenceRunner = SequenceRunner; class SequenceBuilder { constructor() { this.currentSequenceNode = null; this.beginSequenceNode = null; this.whileNodeStack = []; } then(action) { if (this.currentSequenceNode == null) { this.currentSequenceNode = new SequenceNode(); this.currentSequenceNode.action = action; this.beginSequenceNode = this.currentSequenceNode; } else { let next = new SequenceNode(); next.action = action; this.currentSequenceNode = this.currentSequenceNode.then(next); } return this; } if(condition) { let ifSeq = new IfSequenceNode(condition); if (this.currentSequenceNode == null) { this.currentSequenceNode = ifSeq; this.beginSequenceNode = ifSeq; } else { this.currentSequenceNode = this.currentSequenceNode.then(ifSeq); } return this; } else() { let seq = this.currentSequenceNode.getSequence(); if (seq instanceof IfSequenceNode) { seq.closed = true; let elseSeq = new ElseSequenceNode(seq); this.currentSequenceNode = this .currentSequenceNode.then(elseSeq); } else { throw new Error('IF statement is needed to be called before ELSE statement.'); } return this; } endIf() { let seq = this.currentSequenceNode.getSequence(); if (seq instanceof IfSequenceNode || seq instanceof ElseSequenceNode) { seq.closed = true; } else { throw new Error('IF statement is needed to be called before ENDIF statement.'); } return this; } while(condition) { let whileSeq = new WhileSequenceNode(condition); if (this.currentSequenceNode == null) { this.currentSequenceNode = whileSeq; this.beginSequenceNode = whileSeq; } else { this.currentSequenceNode = this.currentSequenceNode.then(whileSeq); } this.whileNodeStack.push(whileSeq); return this; } endWhile() { let seq = this.currentSequenceNode.getSequence(); if (seq instanceof WhileSequenceNode) { seq.closed = true; if (this.whileNodeStack.length > 0) { this.whileNodeStack.splice(this.whileNodeStack.length - 1, 1); } } else { throw new Error('WHILE statement is needed to be called before ENDWHILE statement.'); } return this; } breakWhile() { if (this.whileNodeStack.length > 0) { this.currentSequenceNode = this .currentSequenceNode.then(new BreakWhileSequenceNode(this.whileNodeStack[this.whileNodeStack.length - 1])); } else { throw new Error('WHILE statement is needed to be called before BREAKWHILE statement.'); } return this; } } actions.SequenceBuilder = SequenceBuilder; class SequenceNode { constructor() { this.action = null; this.next = null; } then(next) { this.next = next; return next; } onStart() { if (this.action) this.action.onStart(); } update(dt) { if (this.action) this.action.update(dt); } onFinish() { if (this.action) this.action.onFinish(); } hasFinish() { if (this.action) return this.action.hasFinished; else return true; } getSequence() { return this; } } actions.SequenceNode = SequenceNode; class SubSequenceNode extends SequenceNode { constructor() { super(...arguments); this.currentInnerSequence = null; this.startingInnerSequence = null; this.closed = false; } then(next) { if (this.currentInnerSequence == null) { this.currentInnerSequence = next; this.startingInnerSequence = next; } else { if (this.closed) { this.next = next; return next; } else { this.currentInnerSequence = this.currentInnerSequence.then(next); } } return this; } onStart() { this.currentInnerSequence = this.startingInnerSequence; if (this.currentInnerSequence) this.currentInnerSequence.onStart(); } update(dt) { if (this.currentInnerSequence) { if (!this.currentInnerSequence.hasFinish()) { this.currentInnerSequence.update(dt); } else { this.currentInnerSequence.onFinish(); this.currentInnerSequence = this.currentInnerSequence.next; if (this.currentInnerSequence) this.currentInnerSequence.onStart(); } } } onFinish() { if (this.currentInnerSequence) this.currentInnerSequence.onFinish(); } hasFinish() { return this.currentInnerSequence == null; } getSequence() { if (this.currentInnerSequence) { let innerSeq = this.currentInnerSequence.getSequence(); if (innerSeq instanceof SubSequenceNode) { if (!innerSeq.closed) { return innerSeq; } } } return this; } } class IfSequenceNode extends SubSequenceNode { constructor(condition) { super(); this.result = false; this.condition = condition; } onStart() { this.result = this.condition(); if (this.result) super.onStart(); else this.currentInnerSequence = null; } } class ElseSequenceNode extends SubSequenceNode { constructor(ifSequence) { super(); this.ifSequence = null; this.ifSequence = ifSequence; } onStart() { if (this.ifSequence && !this.ifSequence.result) super.onStart(); else this.currentInnerSequence = null; } } class WhileSequenceNode extends SubSequenceNode { constructor(condition) { super(); this.breakWhile = false; this.condition = condition; } onStart() { this.breakWhile = false; if (this.condition()) super.onStart(); else this.currentInnerSequence = null; } update(dt) { if (this.currentInnerSequence) { if (!this.currentInnerSequence.hasFinish()) { this.currentInnerSequence.update(dt); } else { this.currentInnerSequence.onFinish(); this.currentInnerSequence = this.currentInnerSequence.next; if (this.currentInnerSequence == null) this.currentInnerSequence = this.startingInnerSequence; if (this.currentInnerSequence) this.currentInnerSequence.onStart(); } } } hasFinish() { return this.breakWhile || !this.condition(); } } class BreakWhileSequenceNode extends SequenceNode { constructor(whileNode) { super(); this.whileNode = whileNode; } onStart() { this.whileNode.breakWhile = true; } } })(actions || (actions = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXJDLE1BQU0sS0FBVyxPQUFPLENBcVh2QjtBQXJYRCxXQUFpQixPQUFPO0lBRXRCLE1BQWEsY0FBYztRQVl6QixZQUNFLFlBQXFCLEVBQ3JCLGFBQStCLEVBQy9CLGdCQUE2QjtZQWR2QixzQkFBaUIsR0FBd0IsSUFBSSxDQUFBO1lBQzdDLHdCQUFtQixHQUF3QixJQUFJLENBQUE7WUFLL0MsWUFBTyxHQUFZLEtBQUssQ0FBQTtZQUN4QixZQUFPLEdBQVksS0FBSyxDQUFBO1lBUzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFBO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUNuRSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ25DLENBQUM7WUFDRCxJQUFJLGdCQUFnQjtnQkFDbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUVELGFBQWEsQ0FBQyxhQUE4QjtZQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixDQUFBO1lBQ3hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7WUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDbkIsSUFBSSxDQUFD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QUN2QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEVBQVU7WUFDZixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUE7b0JBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFBO29CQUMxRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJO3dCQUNuQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFBO29CQUN4RCxJQUFJLElBQUksQ0FBQyxvQkFBb0I7d0JBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFBO2dCQUNwRSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxTQUFTO1lBQ1AsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQzdDLENBQUM7S0FDRjtJQUVELE1BQU0sc0JBQXVCLFNBQVEsWUFBWTtRQUcvQyxZQUFZLFNBQTRCO1lBQ3RDLEtBQUssRUFBRSxDQUFBO1lBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDNUIsQ0FBQztRQUVELE9BQU87WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDbEMsQ0FBQztLQUNGO0FBQ0gsQ0FBQyxFQXJYZ0IsT0FBTyxLQUFQLE9BQU8sUUFxWHZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVuZ2luZSwgU3lzdGVtRm4gfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgeyBwcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknXG5cbmV4cG9ydCBuYW1lc3BhY2UgYWN0aW9ucyB7XG5cbiAgZXhwb3J0IGNsYXNzIFNlcXVlbmNlUnVubmVyIHtcbiAgICBwcml2YXRlIGJlZ2luU2VxdWVuY2VOb2RlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuICAgIHByaXZhdGUgY3VycmVudFNlcXVlbmNlTm9kZTogU2VxdWVuY2VOb2RlIHwgbnVsbCA9IG51bGxcblxuICAgIHByaXZhdGUgZW5naW5lOiBJRW5naW5lXG4gICAgcHJpdmF0ZSBzeXN0ZW1GbjogU3lzdGVtRm5cblxuICAgIHByaXZhdGUgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGFydGVkOiBib29sZWFuID0gZmFsc2VcblxuICAgIHByaXZhdGUgb25GaW5pc2hDYWxsYmFjaz86ICgpID0+IHZvaWRcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgdGFyZ2V0RW5naW5lOiBJRW5naW5lLFxuICAgICAgc2VxdWVuY2VCdWlsdD86IFNlcXVlbmNlQnVpbGRlcixcbiAgICAgIG9uRmluaXNoQ2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gICAgKSB7XG4gICAgICB0aGlzLmVuZ2luZSA9IHRhcmdldEVuZ2luZVxuICAgICAgdGhpcy5zeXN0ZW1GbiA9IChkdCkgPT4geyB0aGlzLnVwZGF0ZShkdCkgfVxuICAgICAgdGhpcy5lbmdpbmUuYWRkU3lzdGVtKHRoaXMuc3lzdGVtRm4sIHByaW9yaXR5LkFjdGlvblN5c3RlbVByaW9yaXR5KVxuICAgICAgaWYgKHNlcXVlbmNlQnVpbHQpIHtcbiAgICAgICAgdGhpcy5zdGFydFNlcXVlbmNlKHNlcXVlbmNlQnVpbHQpXG4gICAgICB9XG4gICAgICBpZiAob25GaW5pc2hDYWxsYmFjaylcbiAgICAgICAgdGhpcy5zZXRPbkZpbmlzaENhbGxiYWNrKG9uRmluaXNoQ2FsbGJhY2spXG4gICAgfVxuICBcbiAgICBzdGFydFNlcXVlbmNlKHNlcXVlbmNlQnVpbHQ6IFNlcXVlbmNlQnVpbGRlcikge1xuICAgICAgdGhpcy5iZWdpblNlcXVlbmNlTm9kZSA9IHNlcXVlbmNlQnVpbHQuYmVnaW5TZXF1ZW5jZU5vZGVcbiAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IHRoaXMuYmVnaW5TZXF1ZW5jZU5vZGVcbiAgICAgIHRoaXMucnVubmluZyA9IHRydWVcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuZW5naW5lLnJlbW92ZVN5c3RlbSh0aGlzLnN5c3RlbUZuKVxuICAgIH1cblxuICAgIHNldE9uRmluaXNoQ2FsbGJhY2sob25GaW5pc2hDYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgICAgdGhpcy5vbkZpbmlzaENhbGxiYWNrID0gb25GaW5pc2hDYWxsYmFja1xuICAgIH1cblxuICAgIGlzUnVubmluZygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bm5pbmdcbiAgICB9XG5cbiAgICBzdG9wKCkge1xuICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2VcbiAgICB9XG5cbiAgICByZXN1bWUoKSB7XG4gICAgICBpZiAodGhpcy5iZWdpblNlcXVlbmNlTm9kZSAhPSBudWxsKVxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlXG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSB0aGlzLmJlZ2luU2VxdWVuY2VOb2RlXG4gICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlXG4gICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuICAgIH1cblxuICAgIGdldFJ1bm5pbmdBY3Rpb24oKTogSUFjdGlvbiB8IG51bGwge1xuICAgICAgbGV0IGN1cnJlbnROb2RlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlXG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgaW5zdGFuY2VvZiBTdWJTZXF1ZW5jZU5vZGUpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gKGN1cnJlbnROb2RlIGFzIFN1YlNlcXVlbmNlTm9kZSkuY3VycmVudElubmVyU2VxdWVuY2VcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBTdWJTZXF1ZW5jZU5vZGUpXG4gICAgICB9XG4gICAgICByZXR1cm4gKGN1cnJlbnROb2RlIGFzIFNlcXVlbmNlTm9kZSkuYWN0aW9uXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGUoZHQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpXG4gICAgICAgIHJldHVyblxuICAgICAgICBcbiAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgYXMgU2VxdWVuY2VOb2RlKS5vblN0YXJ0KClcbiAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICBcbiAgICAgIGlmICghKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLmhhc0ZpbmlzaCgpKSB7XG4gICAgICAgICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgYXMgU2VxdWVuY2VOb2RlKS51cGRhdGUoZHQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkub25GaW5pc2goKVxuICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLm5leHRcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlLm9uU3RhcnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2VcbiAgICAgICAgaWYgKHRoaXMub25GaW5pc2hDYWxsYmFjaykgdGhpcy5vbkZpbmlzaENhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIElBY3Rpb24ge1xuICAgIG9uU3RhcnQoKTogdm9pZFxuICAgIHVwZGF0ZShkdDogbnVtYmVyKTogdm9pZFxuICAgIG9uRmluaXNoKCk6IHZvaWRcbiAgICBoYXNGaW5pc2hlZDogYm9vbGVhblxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFNlcXVlbmNlQnVpbGRlciB7XG4gICAgcHJpdmF0ZSBjdXJyZW50U2VxdWVuY2VOb2RlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBiZWdpblNlcXVlbmNlTm9kZTogU2VxdWVuY2VOb2RlIHwgbnVsbCA9IG51bGxcblxuICAgIHByaXZhdGUgd2hpbGVOb2RlU3RhY2s6IFdoaWxlU2VxdWVuY2VOb2RlW10gPSBbXVxuXG4gICAgdGhlbihhY3Rpb246IElBY3Rpb24pOiBTZXF1ZW5jZUJ1aWxkZXIge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IG5ldyBTZXF1ZW5jZU5vZGUoKVxuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUuYWN0aW9uID0gYWN0aW9uXG4gICAgICAgIHRoaXMuYmVnaW5TZXF1ZW5jZU5vZGUgPSB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBuZXh0ID0gbmV3IFNlcXVlbmNlTm9kZSgpXG4gICAgICAgIG5leHQuYWN0aW9uID0gYWN0aW9uXG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZS50aGVuKG5leHQpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlmKGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhbik6IFNlcXVlbmNlQnVpbGRlciB7XG4gICAgICBsZXQgaWZTZXEgPSBuZXcgSWZTZXF1ZW5jZU5vZGUoY29uZGl0aW9uKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IGlmU2VxXG4gICAgICAgIHRoaXMuYmVnaW5TZXF1ZW5jZU5vZGUgPSBpZlNlcVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlLnRoZW4oaWZTZXEpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGVsc2UoKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGxldCBzZXEgPSAodGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkuZ2V0U2VxdWVuY2UoKVxuICAgICAgaWYgKHNlcSBpbnN0YW5jZW9mIElmU2VxdWVuY2VOb2RlKSB7XG4gICAgICAgIHNlcS5jbG9zZWQgPSB0cnVlXG4gICAgICAgIGxldCBlbHNlU2VxID0gbmV3IEVsc2VTZXF1ZW5jZU5vZGUoc2VxKVxuICAgICAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZU5vZGUgPSAodGhpc1xuICAgICAgICAgIC5jdXJyZW50U2VxdWVuY2VOb2RlIGFzIFNlcXVlbmNlTm9kZSkudGhlbihlbHNlU2VxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdJRiBzdGF0ZW1lbnQgaXMgbmVlZGVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgRUxTRSBzdGF0ZW1lbnQuJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGVuZElmKCk6IFNlcXVlbmNlQnVpbGRlciB7XG4gICAgICBsZXQgc2VxID0gKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLmdldFNlcXVlbmNlKClcbiAgICAgIGlmIChzZXEgaW5zdGFuY2VvZiBJZlNlcXVlbmNlTm9kZSB8fCBzZXEgaW5zdGFuY2VvZiBFbHNlU2VxdWVuY2VOb2RlKSB7XG4gICAgICAgIHNlcS5jbG9zZWQgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0lGIHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gYmUgY2FsbGVkIGJlZm9yZSBFTkRJRiBzdGF0ZW1lbnQuJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHdoaWxlKGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhbik6IFNlcXVlbmNlQnVpbGRlciB7XG4gICAgICBsZXQgd2hpbGVTZXEgPSBuZXcgV2hpbGVTZXF1ZW5jZU5vZGUoY29uZGl0aW9uKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSA9IHdoaWxlU2VxXG4gICAgICAgIHRoaXMuYmVnaW5TZXF1ZW5jZU5vZGUgPSB3aGlsZVNlcVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlLnRoZW4od2hpbGVTZXEpXG4gICAgICB9XG4gICAgICB0aGlzLndoaWxlTm9kZVN0YWNrLnB1c2god2hpbGVTZXEpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGVuZFdoaWxlKCk6IFNlcXVlbmNlQnVpbGRlciB7XG4gICAgICBsZXQgc2VxID0gKHRoaXMuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLmdldFNlcXVlbmNlKClcbiAgICAgIGlmIChzZXEgaW5zdGFuY2VvZiBXaGlsZVNlcXVlbmNlTm9kZSkge1xuICAgICAgICBzZXEuY2xvc2VkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy53aGlsZU5vZGVTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy53aGlsZU5vZGVTdGFjay5zcGxpY2UodGhpcy53aGlsZU5vZGVTdGFjay5sZW5ndGggLSAxLCAxKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1dISUxFIHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gYmUgY2FsbGVkIGJlZm9yZSBFTkRXSElMRSBzdGF0ZW1lbnQuJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGJyZWFrV2hpbGUoKTogU2VxdWVuY2VCdWlsZGVyIHtcbiAgICAgIGlmICh0aGlzLndoaWxlTm9kZVN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2VOb2RlID0gKHRoaXNcbiAgICAgICAgICAuY3VycmVudFNlcXVlbmNlTm9kZSBhcyBTZXF1ZW5jZU5vZGUpLnRoZW4oXG4gICAgICAgICAgbmV3IEJyZWFrV2hpbGVTZXF1ZW5jZU5vZGUoXG4gICAgICAgICAgICB0aGlzLndoaWxlTm9kZVN0YWNrW3RoaXMud2hpbGVOb2RlU3RhY2subGVuZ3RoIC0gMV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnV0hJTEUgc3RhdGVtZW50IGlzIG5lZWRlZCB0byBiZSBjYWxsZWQgYmVmb3JlIEJSRUFLV0hJTEUgc3RhdGVtZW50LidcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgU2VxdWVuY2VOb2RlIHtcbiAgICBhY3Rpb246IElBY3Rpb24gfCBudWxsID0gbnVsbFxuICAgIG5leHQ6IFNlcXVlbmNlTm9kZSB8IG51bGwgPSBudWxsXG4gIFxuICAgIHRoZW4obmV4dDogU2VxdWVuY2VOb2RlKTogU2VxdWVuY2VOb2RlIHtcbiAgICAgIHRoaXMubmV4dCA9IG5leHRcbiAgICAgIHJldHVybiBuZXh0XG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgaWYgKHRoaXMuYWN0aW9uKSB0aGlzLmFjdGlvbi5vblN0YXJ0KClcbiAgICB9XG4gIFxuICAgIHVwZGF0ZShkdDogbnVtYmVyKSB7XG4gICAgICBpZiAodGhpcy5hY3Rpb24pIHRoaXMuYWN0aW9uLnVwZGF0ZShkdClcbiAgICB9XG4gIFxuICAgIG9uRmluaXNoKCkge1xuICAgICAgaWYgKHRoaXMuYWN0aW9uKSB0aGlzLmFjdGlvbi5vbkZpbmlzaCgpXG4gICAgfVxuICBcbiAgICBoYXNGaW5pc2goKTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcy5hY3Rpb24pIHJldHVybiB0aGlzLmFjdGlvbi5oYXNGaW5pc2hlZFxuICAgICAgZWxzZSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgXG4gICAgZ2V0U2VxdWVuY2UoKTogU2VxdWVuY2VOb2RlIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG4gIFxuICBjbGFzcyBTdWJTZXF1ZW5jZU5vZGUgZXh0ZW5kcyBTZXF1ZW5jZU5vZGUge1xuICAgIGN1cnJlbnRJbm5lclNlcXVlbmNlOiBTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuICAgIHN0YXJ0aW5nSW5uZXJTZXF1ZW5jZTogU2VxdWVuY2VOb2RlIHwgbnVsbCA9IG51bGxcbiAgICBjbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBcbiAgICB0aGVuKG5leHQ6IFNlcXVlbmNlTm9kZSk6IFNlcXVlbmNlTm9kZSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSBuZXh0XG4gICAgICAgIHRoaXMuc3RhcnRpbmdJbm5lclNlcXVlbmNlID0gbmV4dFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dFxuICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UudGhlbihuZXh0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgXG4gICAgb25TdGFydCgpIHtcbiAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSB0aGlzLnN0YXJ0aW5nSW5uZXJTZXF1ZW5jZVxuICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UpIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2Uub25TdGFydCgpXG4gICAgfVxuICBcbiAgICB1cGRhdGUoZHQ6IG51bWJlcikge1xuICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLmhhc0ZpbmlzaCgpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS51cGRhdGUoZHQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS5vbkZpbmlzaCgpXG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UubmV4dFxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlKSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm9uU3RhcnQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBvbkZpbmlzaCgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlKSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm9uRmluaXNoKClcbiAgICB9XG4gIFxuICAgIGhhc0ZpbmlzaCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID09IG51bGxcbiAgICB9XG4gIFxuICAgIGdldFNlcXVlbmNlKCk6IFNlcXVlbmNlTm9kZSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSkge1xuICAgICAgICBsZXQgaW5uZXJTZXEgPSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLmdldFNlcXVlbmNlKClcbiAgICAgICAgaWYgKGlubmVyU2VxIGluc3RhbmNlb2YgU3ViU2VxdWVuY2VOb2RlKSB7XG4gICAgICAgICAgaWYgKCFpbm5lclNlcS5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbm5lclNlcVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cbiAgXG4gIGNsYXNzIElmU2VxdWVuY2VOb2RlIGV4dGVuZHMgU3ViU2VxdWVuY2VOb2RlIHtcbiAgICBjb25kaXRpb246ICgpID0+IGJvb2xlYW5cbiAgICByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZVxuICBcbiAgICBjb25zdHJ1Y3Rvcihjb25kaXRpb246ICgpID0+IGJvb2xlYW4pIHtcbiAgICAgIHN1cGVyKClcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uXG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNvbmRpdGlvbigpXG4gICAgICBpZiAodGhpcy5yZXN1bHQpIHN1cGVyLm9uU3RhcnQoKVxuICAgICAgZWxzZSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gbnVsbFxuICAgIH1cbiAgfVxuICBcbiAgY2xhc3MgRWxzZVNlcXVlbmNlTm9kZSBleHRlbmRzIFN1YlNlcXVlbmNlTm9kZSB7XG4gICAgaWZTZXF1ZW5jZTogSWZTZXF1ZW5jZU5vZGUgfCBudWxsID0gbnVsbFxuICBcbiAgICBjb25zdHJ1Y3RvcihpZlNlcXVlbmNlOiBJZlNlcXVlbmNlTm9kZSkge1xuICAgICAgc3VwZXIoKVxuICAgICAgdGhpcy5pZlNlcXVlbmNlID0gaWZTZXF1ZW5jZVxuICAgIH1cbiAgXG4gICAgb25TdGFydCgpIHtcbiAgICAgIGlmICh0aGlzLmlmU2VxdWVuY2UgJiYgIXRoaXMuaWZTZXF1ZW5jZS5yZXN1bHQpIHN1cGVyLm9uU3RhcnQoKVxuICAgICAgZWxzZSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gbnVsbFxuICAgIH1cbiAgfVxuICBcbiAgY2xhc3MgV2hpbGVTZXF1ZW5jZU5vZGUgZXh0ZW5kcyBTdWJTZXF1ZW5jZU5vZGUge1xuICAgIGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhblxuICAgIGJyZWFrV2hpbGU6IGJvb2xlYW4gPSBmYWxzZVxuICBcbiAgICBjb25zdHJ1Y3Rvcihjb25kaXRpb246ICgpID0+IGJvb2xlYW4pIHtcbiAgICAgIHN1cGVyKClcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uXG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgdGhpcy5icmVha1doaWxlID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmNvbmRpdGlvbigpKSBzdXBlci5vblN0YXJ0KClcbiAgICAgIGVsc2UgdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSA9IG51bGxcbiAgICB9XG4gIFxuICAgIHVwZGF0ZShkdDogbnVtYmVyKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZSkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudElubmVyU2VxdWVuY2UuaGFzRmluaXNoKCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLnVwZGF0ZShkdClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm9uRmluaXNoKClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlID0gdGhpcy5jdXJyZW50SW5uZXJTZXF1ZW5jZS5uZXh0XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuY3VycmVudElubmVyU2VxdWVuY2UgPSB0aGlzLnN0YXJ0aW5nSW5uZXJTZXF1ZW5jZVxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlKSB0aGlzLmN1cnJlbnRJbm5lclNlcXVlbmNlLm9uU3RhcnQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBoYXNGaW5pc2goKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5icmVha1doaWxlIHx8ICF0aGlzLmNvbmRpdGlvbigpXG4gICAgfVxuICB9XG4gIFxuICBjbGFzcyBCcmVha1doaWxlU2VxdWVuY2VOb2RlIGV4dGVuZHMgU2VxdWVuY2VOb2RlIHtcbiAgICB3aGlsZU5vZGU6IFdoaWxlU2VxdWVuY2VOb2RlXG4gIFxuICAgIGNvbnN0cnVjdG9yKHdoaWxlTm9kZTogV2hpbGVTZXF1ZW5jZU5vZGUpIHtcbiAgICAgIHN1cGVyKClcbiAgICAgIHRoaXMud2hpbGVOb2RlID0gd2hpbGVOb2RlXG4gICAgfVxuICBcbiAgICBvblN0YXJ0KCkge1xuICAgICAgdGhpcy53aGlsZU5vZGUuYnJlYWtXaGlsZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbiJdfQ==