|  | @@ -289,7 +289,7 @@ function () {
 | 
	
		
			
				|  |  |      key: "obfuscate",
 | 
	
		
			
				|  |  |      value: function obfuscate(sourceCode) {
 | 
	
		
			
				|  |  |        var timeStart = Date.now();
 | 
	
		
			
				|  |  | -      this.logger.info(LoggingMessage_1.LoggingMessage.Version, '0.16.0');
 | 
	
		
			
				|  |  | +      this.logger.info(LoggingMessage_1.LoggingMessage.Version, "0.17.0-dev.1");
 | 
	
		
			
				|  |  |        this.logger.info(LoggingMessage_1.LoggingMessage.ObfuscationStarted);
 | 
	
		
			
				|  |  |        this.logger.info(LoggingMessage_1.LoggingMessage.RandomGeneratorSeed, this.randomGenerator.getSeed());
 | 
	
		
			
				|  |  |        var astTree = this.parseCode(sourceCode);
 | 
	
	
		
			
				|  | @@ -663,7 +663,7 @@ function () {
 | 
	
		
			
				|  |  |                return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (blockScopeBodyNode.parentNode !== NodeUtils_1.NodeUtils.getBlockScopesOfNode(node)[0]) {
 | 
	
		
			
				|  |  | +            if (blockScopeBodyNode.parentNode !== NodeUtils_1.NodeUtils.getBlockScopeOfNode(node)) {
 | 
	
		
			
				|  |  |                return estraverse.VisitorOption.Skip;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -812,7 +812,7 @@ function (_AbstractCalleeDataEx) {
 | 
	
		
			
				|  |  |          return null;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      var calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopesOfNode(blockScopeBody[0])[0], callee.name);
 | 
	
		
			
				|  |  | +      var calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopeOfNode(blockScopeBody[0]), callee.name);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!calleeBlockStatement) {
 | 
	
		
			
				|  |  |          return null;
 | 
	
	
		
			
				|  | @@ -900,7 +900,7 @@ function (_AbstractCalleeDataEx) {
 | 
	
		
			
				|  |  |        var calleeBlockStatement = null;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (NodeGuards_1.NodeGuards.isIdentifierNode(callee)) {
 | 
	
		
			
				|  |  | -        calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopesOfNode(blockScopeBody[0])[0], callee.name);
 | 
	
		
			
				|  |  | +        calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopeOfNode(blockScopeBody[0]), callee.name);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (NodeGuards_1.NodeGuards.isFunctionExpressionNode(callee)) {
 | 
	
	
		
			
				|  | @@ -1006,7 +1006,7 @@ function (_AbstractCalleeDataEx) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        var functionExpressionName = objectMembersCallsChain[objectMembersCallsChain.length - 1];
 | 
	
		
			
				|  |  | -      var calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopesOfNode(blockScopeBody[0])[0], objectMembersCallsChain);
 | 
	
		
			
				|  |  | +      var calleeBlockStatement = this.getCalleeBlockStatement(NodeUtils_1.NodeUtils.getBlockScopeOfNode(blockScopeBody[0]), objectMembersCallsChain);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!calleeBlockStatement) {
 | 
	
		
			
				|  |  |          return null;
 | 
	
	
		
			
				|  | @@ -8357,7 +8357,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |          return false;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      var blockScopeOfBlockStatementNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(blockStatementNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeOfBlockStatementNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(blockStatementNode);
 | 
	
		
			
				|  |  |        return blockScopeOfBlockStatementNode.type !== NodeType_1.NodeType.Program;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }]);
 | 
	
	
		
			
				|  | @@ -8455,7 +8455,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(catchClauseNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(catchClauseNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(catchClauseNode);
 | 
	
		
			
				|  |  |        this.storeCatchClauseParam(catchClauseNode, blockScopeNode);
 | 
	
		
			
				|  |  |        this.replaceCatchClauseParam(catchClauseNode, blockScopeNode);
 | 
	
		
			
				|  |  |        return catchClauseNode;
 | 
	
	
		
			
				|  | @@ -8585,7 +8585,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(classDeclarationNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(classDeclarationNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(classDeclarationNode);
 | 
	
		
			
				|  |  |        var isGlobalDeclaration = blockScopeNode.type === NodeType_1.NodeType.Program;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!this.options.renameGlobals && isGlobalDeclaration) {
 | 
	
	
		
			
				|  | @@ -8748,7 +8748,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(functionDeclarationNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(functionDeclarationNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(functionDeclarationNode);
 | 
	
		
			
				|  |  |        var isGlobalDeclaration = blockScopeNode.type === NodeType_1.NodeType.Program;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!this.options.renameGlobals && isGlobalDeclaration) {
 | 
	
	
		
			
				|  | @@ -8921,7 +8921,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(functionNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeGuards_1.NodeGuards.isBlockStatementNode(functionNode.body) ? functionNode.body : NodeUtils_1.NodeUtils.getBlockScopesOfNode(functionNode.body)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeGuards_1.NodeGuards.isBlockStatementNode(functionNode.body) ? functionNode.body : NodeUtils_1.NodeUtils.getBlockScopeOfNode(functionNode.body);
 | 
	
		
			
				|  |  |        this.storeFunctionParams(functionNode, blockScopeNode);
 | 
	
		
			
				|  |  |        this.replaceFunctionParams(functionNode, blockScopeNode);
 | 
	
		
			
				|  |  |        return functionNode;
 | 
	
	
		
			
				|  | @@ -9090,7 +9090,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(importDeclarationNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(importDeclarationNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(importDeclarationNode);
 | 
	
		
			
				|  |  |        this.storeImportSpecifierNames(importDeclarationNode, blockScopeNode);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (this.replaceableIdentifiers.has(blockScopeNode)) {
 | 
	
	
		
			
				|  | @@ -9249,7 +9249,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(labeledStatementNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(labeledStatementNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(labeledStatementNode);
 | 
	
		
			
				|  |  |        this.storeLabeledStatementName(labeledStatementNode, blockScopeNode);
 | 
	
		
			
				|  |  |        this.replaceLabeledStatementName(labeledStatementNode, blockScopeNode);
 | 
	
		
			
				|  |  |        return labeledStatementNode;
 | 
	
	
		
			
				|  | @@ -9490,7 +9490,7 @@ function (_AbstractNodeTransfor) {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "transformNode",
 | 
	
		
			
				|  |  |      value: function transformNode(variableDeclarationNode, parentNode) {
 | 
	
		
			
				|  |  | -      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopesOfNode(variableDeclarationNode)[0];
 | 
	
		
			
				|  |  | +      var blockScopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(variableDeclarationNode);
 | 
	
		
			
				|  |  |        var isGlobalDeclaration = blockScopeNode.type === NodeType_1.NodeType.Program;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!this.options.renameGlobals && isGlobalDeclaration) {
 | 
	
	
		
			
				|  | @@ -11890,6 +11890,11 @@ function () {
 | 
	
		
			
				|  |  |          }).code;
 | 
	
		
			
				|  |  |        }, '');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +  }, {
 | 
	
		
			
				|  |  | +    key: "getBlockScopeOfNode",
 | 
	
		
			
				|  |  | +    value: function getBlockScopeOfNode(node) {
 | 
	
		
			
				|  |  | +      return NodeUtils.getBlockScopesOfNodeRecursive(node, 1)[0];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "getBlockScopesOfNode",
 | 
	
		
			
				|  |  |      value: function getBlockScopesOfNode(node) {
 | 
	
	
		
			
				|  | @@ -11995,8 +12000,14 @@ function () {
 | 
	
		
			
				|  |  |    }, {
 | 
	
		
			
				|  |  |      key: "getBlockScopesOfNodeRecursive",
 | 
	
		
			
				|  |  |      value: function getBlockScopesOfNodeRecursive(node) {
 | 
	
		
			
				|  |  | -      var blockScopes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
 | 
	
		
			
				|  |  | -      var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
 | 
	
		
			
				|  |  | +      var maxSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
 | 
	
		
			
				|  |  | +      var blockScopes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
 | 
	
		
			
				|  |  | +      var depth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (blockScopes.length >= maxSize) {
 | 
	
		
			
				|  |  | +        return blockScopes;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        var parentNode = node.parentNode;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!parentNode) {
 | 
	
	
		
			
				|  | @@ -12012,7 +12023,7 @@ function () {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (node !== parentNode) {
 | 
	
		
			
				|  |  | -        return NodeUtils.getBlockScopesOfNodeRecursive(parentNode, blockScopes, ++depth);
 | 
	
		
			
				|  |  | +        return NodeUtils.getBlockScopesOfNodeRecursive(parentNode, maxSize, blockScopes, ++depth);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        return blockScopes;
 |