@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
JavaScript
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==