Skip to content

Instantly share code, notes, and snippets.

@jmlopez-rod
Last active November 2, 2016 21:57
Show Gist options
  • Save jmlopez-rod/da74fd48e8f963322ba24a92947b5ed0 to your computer and use it in GitHub Desktop.
Save jmlopez-rod/da74fd48e8f963322ba24a92947b5ed0 to your computer and use it in GitHub Desktop.
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var ts = require('typescript');
var Lint = require('tslint/lib/lint');
var DEFAULT_VARIABLE_INDENT = 1;
var DEFAULT_PARAMETER_INDENT = null;
var DEFAULT_FUNCTION_BODY_INDENT = 1;
var indentType = 'space';
var indentSize = 4;
var OPTIONS;
function assign(target) {
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
sources.forEach(function (source) {
if (source !== undefined && source !== null) {
for (var nextKey in source) {
if (source.hasOwnProperty(nextKey)) {
target[nextKey] = source[nextKey];
}
}
}
});
return target;
}
function isKind(node, kind) {
return node.kind === ts.SyntaxKind[kind];
}
function isOneOf(node, kinds) {
return kinds.some(function (kind) { return node.kind === ts.SyntaxKind[kind]; });
}
var Rule = (function (_super) {
__extends(Rule, _super);
function Rule() {
_super.apply(this, arguments);
}
Rule.prototype.apply = function (sourceFile) {
var walker = new IndentWalker(sourceFile, this.getOptions());
return this.applyWithWalker(walker);
};
Rule.metadata = {
ruleName: 'ter-indent',
description: 'enforce consistent indentation',
rationale: (_a = ["\n Using only one of tabs or spaces for indentation leads to more consistent editor behavior,\n cleaner diffs in version control, and easier programmatic manipulation."], _a.raw = ["\n Using only one of tabs or spaces for indentation leads to more consistent editor behavior,\n cleaner diffs in version control, and easier programmatic manipulation."], Lint.Utils.dedent(_a)),
optionsDescription: (_b = ["\n The string 'tab' or an integer indicating the number of spaces to use per tab.\n\n An object may be provided to fine tune the indentation rules:\n \n * `\"SwitchCase\"` (default: 0) enforces indentation level for `case` clauses in \n `switch` statements\n * `\"VariableDeclarator\"` (default: 1) enforces indentation level for `var` declarators;\n can also take an object to define separate rules for `var`,\n `let` and `const` declarations.\n * `\"outerIIFEBody\"` (default: 1) enforces indentation level for file-level IIFEs.\n * `\"MemberExpression\"` (off by default) enforces indentation level for multi-line\n property chains (except in variable declarations and assignments)\n * `\"FunctionDeclaration\"` takes an object to define rules for function declarations.\n * `\"parameters\"` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string `\"first\"` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * `\"body\"` (default: 1) enforces indentation level for the body of a function expression.\n * `\"FunctionExpression\"` takes an object to define rules for function declarations.\n * `\"parameters\"` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string `\"first\"` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * `\"body\"` (default: 1) enforces indentation level for the body of a function expression.\n "], _b.raw = ["\n The string 'tab' or an integer indicating the number of spaces to use per tab.\n\n An object may be provided to fine tune the indentation rules:\n \n * \\`\"SwitchCase\"\\` (default: 0) enforces indentation level for \\`case\\` clauses in \n \\`switch\\` statements\n * \\`\"VariableDeclarator\"\\` (default: 1) enforces indentation level for \\`var\\` declarators;\n can also take an object to define separate rules for \\`var\\`,\n \\`let\\` and \\`const\\` declarations.\n * \\`\"outerIIFEBody\"\\` (default: 1) enforces indentation level for file-level IIFEs.\n * \\`\"MemberExpression\"\\` (off by default) enforces indentation level for multi-line\n property chains (except in variable declarations and assignments)\n * \\`\"FunctionDeclaration\"\\` takes an object to define rules for function declarations.\n * \\`\"parameters\"\\` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string \\`\"first\"\\` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * \\`\"body\"\\` (default: 1) enforces indentation level for the body of a function expression.\n * \\`\"FunctionExpression\"\\` takes an object to define rules for function declarations.\n * \\`\"parameters\"\\` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string \\`\"first\"\\` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * \\`\"body\"\\` (default: 1) enforces indentation level for the body of a function expression.\n "], Lint.Utils.dedent(_b)),
options: {
type: 'array',
items: [{
type: 'number',
minimum: '0'
}, {
type: 'string',
enum: ['tab']
}, {
type: 'object',
properties: {
SwitchCase: {
type: 'number',
minimum: 0
},
VariableDeclarator: {
type: 'object',
properties: {
var: {
type: 'number',
minimum: 0
},
let: {
type: 'number',
minimum: 0
},
const: {
type: 'number',
minimum: 0
}
}
},
outerIIFEBody: {
type: 'number'
},
FunctionDeclaration: {
type: 'object',
properties: {
parameters: {
type: 'number',
minimum: 0
},
body: {
type: 'number',
minimum: 0
}
}
},
FunctionExpression: {
type: 'object',
properties: {
parameters: {
type: 'number',
minimum: 0
},
body: {
type: 'number',
minimum: 0
}
}
},
MemberExpression: {
type: 'number'
}
},
additionalProperties: false
}],
minLength: 1,
maxLength: 2
},
optionExamples: [],
type: 'maintainability'
};
return Rule;
var _a, _b;
}(Lint.Rules.AbstractRule));
exports.Rule = Rule;
var IndentWalker = (function (_super) {
__extends(IndentWalker, _super);
function IndentWalker(sourceFile, options) {
_super.call(this, sourceFile, options);
this.caseIndentStore = {};
this.varIndentStore = {};
OPTIONS = {
SwitchCase: 0,
VariableDeclarator: {
var: DEFAULT_VARIABLE_INDENT,
let: DEFAULT_VARIABLE_INDENT,
const: DEFAULT_VARIABLE_INDENT
},
outerIIFEBody: null,
FunctionDeclaration: {
parameters: DEFAULT_PARAMETER_INDENT,
body: DEFAULT_FUNCTION_BODY_INDENT
},
FunctionExpression: {
parameters: DEFAULT_PARAMETER_INDENT,
body: DEFAULT_FUNCTION_BODY_INDENT
}
};
var firstParam = this.getOptions()[0];
if (firstParam === 'tab') {
indentSize = 1;
indentType = 'tab';
}
else {
indentSize = firstParam || 4;
indentType = 'space';
}
var userOptions = this.getOptions()[1];
if (userOptions) {
OPTIONS.SwitchCase = userOptions.SwitchCase || 0;
if (typeof userOptions.VariableDeclarator === 'number') {
OPTIONS.VariableDeclarator = {
var: userOptions.VariableDeclarator,
let: userOptions.VariableDeclarator,
const: userOptions.VariableDeclarator
};
}
else if (typeof userOptions.VariableDeclarator === 'object') {
assign(OPTIONS.VariableDeclarator, userOptions.VariableDeclarator);
}
if (typeof userOptions.outerIIFEBody === 'number') {
OPTIONS.outerIIFEBody = userOptions.outerIIFEBody;
}
if (typeof userOptions.MemberExpression === 'number') {
OPTIONS.MemberExpression = userOptions.MemberExpression;
}
if (typeof userOptions.FunctionDeclaration === 'object') {
assign(OPTIONS.FunctionDeclaration, userOptions.FunctionDeclaration);
}
if (typeof userOptions.FunctionExpression === 'object') {
assign(OPTIONS.FunctionExpression, userOptions.FunctionExpression);
}
}
this.srcFile = sourceFile;
this.srcText = sourceFile.getFullText();
}
IndentWalker.prototype.getSourceSubstr = function (start, end) {
return this.srcText.substr(start, end - start);
};
IndentWalker.prototype.getLineAndCharacter = function (node, byEndLocation) {
if (byEndLocation === void 0) { byEndLocation = false; }
var index = byEndLocation ? node.getEnd() : node.getStart();
return this.srcFile.getLineAndCharacterOfPosition(index);
};
IndentWalker.prototype.getLine = function (node, byEndLocation) {
if (byEndLocation === void 0) { byEndLocation = false; }
return this.getLineAndCharacter(node, byEndLocation).line;
};
IndentWalker.prototype.createErrorMessage = function (expectedAmount, actualSpaces, actualTabs) {
var expectedStatement = expectedAmount + " " + indentType + (expectedAmount === 1 ? '' : 's');
var foundSpacesWord = "space" + (actualSpaces === 1 ? '' : 's');
var foundTabsWord = "tab" + (actualTabs === 1 ? '' : 's');
var foundStatement;
if (actualSpaces > 0 && actualTabs > 0) {
foundStatement = actualSpaces + " " + foundSpacesWord + " and " + actualTabs + " " + foundTabsWord;
}
else if (actualSpaces > 0) {
foundStatement = indentType === 'space' ? actualSpaces : actualSpaces + " " + foundSpacesWord;
}
else if (actualTabs > 0) {
foundStatement = indentType === 'tab' ? actualTabs : actualTabs + " " + foundTabsWord;
}
else {
foundStatement = '0';
}
return "Expected indentation of " + expectedStatement + " but found " + foundStatement + ".";
};
IndentWalker.prototype.report = function (node, needed, gottenSpaces, gottenTabs) {
if (gottenSpaces && gottenTabs) {
return;
}
var msg = this.createErrorMessage(needed, gottenSpaces, gottenTabs);
var width = gottenSpaces + gottenTabs;
this.addFailure(this.createFailure(node.getStart() - width, width, msg));
};
IndentWalker.prototype.isNodeFirstInLine = function (node, byEndLocation) {
if (byEndLocation === void 0) { byEndLocation = false; }
var token = byEndLocation ? node.getLastToken() : node.getFirstToken();
var pos = token.getStart() - 1;
while ([' ', '\t'].indexOf(this.srcText.charAt(pos)) !== -1) {
pos -= 1;
}
return this.srcText.charAt(pos) === '\n';
};
IndentWalker.prototype.getNodeIndent = function (node) {
if (node === this.getSourceFile()) {
return { space: 0, tab: 0, goodChar: 0, badChar: 0 };
}
if (node.kind === ts.SyntaxKind.SyntaxList) {
return this.getNodeIndent(node.parent);
}
var endIndex = node.getStart();
var pos = endIndex - 1;
while (pos > 0 && this.srcText.charAt(pos) !== '\n') {
pos -= 1;
}
var str = this.getSourceSubstr(pos + 1, endIndex);
var whiteSpace = (str.match(/^\s+/) || [''])[0];
var indentChars = whiteSpace.split('');
var spaces = indentChars.filter(function (char) { return char === ' '; }).length;
var tabs = indentChars.filter(function (char) { return char === '\t'; }).length;
var firstInLine = false;
var comments = ts.getLeadingCommentRanges(node.getFullText(), 0);
if (comments && comments.length) {
var offset = node.getFullStart();
var lastComment = comments[comments.length - 1];
var comment = this.getSourceSubstr(lastComment.pos + offset, lastComment.end + offset);
if (comment.indexOf('\n') !== -1) {
firstInLine = true;
}
}
return {
firstInLine: spaces + tabs === str.length || firstInLine,
space: spaces,
tab: tabs,
goodChar: indentType === 'space' ? spaces : tabs,
badChar: indentType === 'space' ? tabs : spaces
};
};
IndentWalker.prototype.checkNodeIndent = function (node, neededIndent) {
var actualIndent = this.getNodeIndent(node);
if (!isKind(node, 'ArrayLiteralExpression') &&
!isKind(node, 'ObjectLiteralExpression') &&
(actualIndent.goodChar !== neededIndent || actualIndent.badChar !== 0) &&
actualIndent.firstInLine) {
this.report(node, neededIndent, actualIndent.space, actualIndent.tab);
}
if (isKind(node, 'IfStatement')) {
var elseStatement = node.elseStatement;
if (elseStatement) {
var elseKeyword = node.getChildren().filter(function (ch) { return isKind(ch, 'ElseKeyword'); }).shift();
this.checkNodeIndent(elseKeyword, neededIndent);
if (!this.isNodeFirstInLine(elseStatement)) {
this.checkNodeIndent(elseStatement, neededIndent);
}
}
}
};
IndentWalker.prototype.isSingleLineNode = function (node) {
var text = node.kind === ts.SyntaxKind.SyntaxList ? node.getFullText() : node.getText();
return text.indexOf('\n') === -1;
};
IndentWalker.prototype.blockIndentationCheck = function (node) {
if (this.isSingleLineNode(node)) {
return;
}
var functionLike = ['FunctionExpression', 'FunctionDeclaration', 'ArrowFunction'];
if (node.parent && isOneOf(node.parent, functionLike)) {
this.checkIndentInFunctionBlock(node);
return;
}
var indent;
var nodesToCheck = [];
var statementsWithProperties = [
'IfStatement',
'WhileStatement',
'ForStatement',
'ForInStatement',
'ForOfStatement',
'DoStatement',
'ClassDeclaration',
'ClassExpression',
'SourceFile'
];
if (node.parent && isOneOf(node.parent, statementsWithProperties) && this.isNodeBodyBlock(node)) {
indent = this.getNodeIndent(node.parent).goodChar;
}
else {
indent = this.getNodeIndent(node).goodChar;
}
if (isKind(node, 'IfStatement') && !isKind(node['thenStatement'], 'Block')) {
nodesToCheck = [node['thenStatement']];
}
else {
if (node.kind === ts.SyntaxKind.Block) {
nodesToCheck = node.getChildren()[1].getChildren();
}
else if (isOneOf(node.parent, ['ClassDeclaration', 'ClassExpression'])) {
nodesToCheck = node.getChildren();
}
else {
nodesToCheck = [node.statement];
}
}
this.checkNodeIndent(node, indent);
if (nodesToCheck.length > 0) {
this.checkNodesIndent(nodesToCheck, indent + indentSize);
}
if (isKind(node, 'Block')) {
this.checkLastNodeLineIndent(node, indent);
}
};
IndentWalker.prototype.isClassLike = function (node) {
return isOneOf(node, ['ClassDeclaration', 'ClassExpression']);
};
IndentWalker.prototype.isAssignment = function (node) {
if (!isKind(node, 'BinaryExpression')) {
return false;
}
return node.operatorToken.getText() === '=';
};
IndentWalker.prototype.isNodeBodyBlock = function (node) {
return node.kind === ts.SyntaxKind.Block ||
(node.kind === ts.SyntaxKind.SyntaxList && this.isClassLike(node.parent.kind));
};
IndentWalker.prototype.checkFirstNodeLineIndent = function (node, firstLineIndent) {
var startIndent = this.getNodeIndent(node);
var firstInLine = startIndent.firstInLine;
if (firstInLine && (startIndent.goodChar !== firstLineIndent || startIndent.badChar !== 0)) {
this.report(node, firstLineIndent, startIndent.space, startIndent.tab);
}
};
IndentWalker.prototype.checkLastNodeLineIndent = function (node, lastLineIndent) {
var lastToken = node.getLastToken();
var endIndent = this.getNodeIndent(lastToken);
var firstInLine = endIndent.firstInLine;
if (firstInLine && (endIndent.goodChar !== lastLineIndent || endIndent.badChar !== 0)) {
this.report(lastToken, lastLineIndent, endIndent.space, endIndent.tab);
}
};
IndentWalker.prototype.isOuterIIFE = function (node) {
var parent = node.parent;
var expressionIsNode = parent.expression !== node;
if (isKind(parent, 'ParenthesizedExpression')) {
parent = parent.parent;
}
var stmt = parent.parent;
if (!isKind(parent, 'CallExpression') || expressionIsNode) {
return false;
}
while (isKind(stmt, 'PrefixUnaryExpression') && (stmt.operator === ts.SyntaxKind.ExclamationToken ||
stmt.operator === ts.SyntaxKind.TildeToken ||
stmt.operator === ts.SyntaxKind.PlusToken ||
stmt.operator === ts.SyntaxKind.MinusToken) ||
isKind(stmt, 'BinaryExpression') ||
isKind(stmt, 'SyntaxList') ||
isKind(stmt, 'VariableDeclaration') ||
isKind(stmt, 'VariableDeclarationList') ||
isKind(stmt, 'ParenthesizedExpression')) {
stmt = stmt.parent;
}
return ((isKind(stmt, 'ExpressionStatement') ||
isKind(stmt, 'VariableStatement')) &&
stmt.parent && isKind(stmt.parent, 'SourceFile'));
};
IndentWalker.prototype.isArgBeforeCalleeNodeMultiline = function (node) {
var parent = node.parent;
if (parent['arguments'].length >= 2 && parent['arguments'][1] === node) {
var firstArg = parent['arguments'][0];
return this.getLine(firstArg, true) > this.getLine(firstArg);
}
return false;
};
IndentWalker.prototype.checkIndentInFunctionBlock = function (node) {
var calleeNode = node.parent;
var indent = this.getNodeIndent(calleeNode).goodChar;
if (calleeNode.parent.kind === ts.SyntaxKind.CallExpression) {
var calleeParent = calleeNode.parent;
if (calleeNode.kind !== ts.SyntaxKind.FunctionExpression && calleeNode.kind !== ts.SyntaxKind.ArrowFunction) {
if (calleeParent && this.getLine(calleeParent) < this.getLine(node)) {
indent = this.getNodeIndent(calleeParent).goodChar;
}
}
else {
var callee = calleeParent.expression;
if (this.isArgBeforeCalleeNodeMultiline(calleeNode) &&
this.getLine(callee) === this.getLine(callee, true) &&
!this.isNodeFirstInLine(calleeNode)) {
indent = this.getNodeIndent(calleeParent).goodChar;
}
}
}
var functionOffset = indentSize;
if (OPTIONS.outerIIFEBody !== null && this.isOuterIIFE(calleeNode)) {
functionOffset = OPTIONS.outerIIFEBody * indentSize;
}
else if (calleeNode.kind === ts.SyntaxKind.FunctionExpression) {
functionOffset = OPTIONS.FunctionExpression.body * indentSize;
}
else if (calleeNode.kind === ts.SyntaxKind.FunctionDeclaration) {
functionOffset = OPTIONS.FunctionDeclaration.body * indentSize;
}
indent += functionOffset;
var parentVarNode = this.getVariableDeclaratorNode(node);
if (parentVarNode && this.isNodeInVarOnTop(node, parentVarNode)) {
var varKind = parentVarNode.parent.getFirstToken().getText();
indent += indentSize * OPTIONS.VariableDeclarator[varKind];
}
if (node.statements.length) {
this.checkNodesIndent(node.statements, indent);
}
this.checkLastNodeLineIndent(node, indent - functionOffset);
};
IndentWalker.prototype.checkNodesIndent = function (nodes, indent) {
var _this = this;
nodes.forEach(function (node) { return _this.checkNodeIndent(node, indent); });
};
IndentWalker.prototype.expectedCaseIndent = function (node, switchIndent) {
var switchNode = (node.kind === ts.SyntaxKind.SwitchStatement) ? node : node.parent;
var line = this.getLine(switchNode);
var caseIndent;
if (this.caseIndentStore[line]) {
return this.caseIndentStore[line];
}
else {
if (typeof switchIndent === 'undefined') {
switchIndent = this.getNodeIndent(switchNode).goodChar;
}
caseIndent = switchIndent + (indentSize * OPTIONS.SwitchCase);
this.caseIndentStore[line] = caseIndent;
return caseIndent;
}
};
IndentWalker.prototype.expectedVarIndent = function (node, varIndent) {
var varNode = node.parent.parent;
var line = this.getLine(varNode);
var indent;
if (this.varIndentStore[line]) {
return this.varIndentStore[line];
}
else {
if (typeof varIndent === 'undefined') {
varIndent = this.getNodeIndent(varNode).goodChar;
}
var varKind = varNode.getFirstToken().getText();
indent = varIndent + (indentSize * OPTIONS.VariableDeclarator[varKind]);
this.varIndentStore[line] = indent;
return indent;
}
};
IndentWalker.prototype.getParentNodeByType = function (node, kind) {
var parent = node.parent;
while (parent.kind !== kind && parent.kind !== ts.SyntaxKind.SourceFile) {
parent = parent.parent;
}
return parent.kind === kind ? parent : null;
};
IndentWalker.prototype.getVariableDeclaratorNode = function (node) {
return this.getParentNodeByType(node, ts.SyntaxKind.VariableDeclaration);
};
IndentWalker.prototype.getBinaryExpressionNode = function (node) {
return this.getParentNodeByType(node, ts.SyntaxKind.BinaryExpression);
};
IndentWalker.prototype.checkIndentInArrayOrObjectBlock = function (node) {
if (this.isSingleLineNode(node)) {
return;
}
var elements = isKind(node, 'ObjectLiteralExpression') ? node['properties'] : node['elements'];
elements = elements.filter(function (elem) {
return elem.getText() !== '';
});
if (elements.length && this.getLine(elements[0]) === this.getLine(node)) {
return;
}
var nodeLine = this.getLine(node);
var nodeEndLine = this.getLine(node, true);
if (elements.length) {
var firstElementLine = this.getLine(elements[0]);
if (nodeLine === firstElementLine) {
return;
}
}
var nodeIndent;
var elementsIndent;
var varKind;
var parentVarNode = this.getVariableDeclaratorNode(node);
if (this.isNodeFirstInLine(node)) {
var parent_1 = node.parent;
var effectiveParent = parent_1;
if (parent_1.kind === ts.SyntaxKind.PropertyDeclaration) {
if (this.isNodeFirstInLine(parent_1)) {
effectiveParent = parent_1.parent.parent;
}
else {
effectiveParent = parent_1.parent;
}
}
nodeIndent = this.getNodeIndent(effectiveParent).goodChar;
if (parentVarNode && this.getLine(parentVarNode) !== nodeLine) {
if (!isKind(parent_1, 'VariableDeclaration') || parentVarNode === parentVarNode.parent.declarations[0]) {
var parentVarLine = this.getLine(parentVarNode);
var effectiveParentLine = this.getLine(effectiveParent);
if (isKind(parent_1, 'VariableDeclaration') && parentVarLine === effectiveParentLine) {
varKind = parentVarNode.parent.getFirstToken().getText();
nodeIndent = nodeIndent + (indentSize * OPTIONS.VariableDeclarator[varKind]);
}
else if (isOneOf(parent_1, [
'ObjectLiteralExpression',
'ArrayLiteralExpression',
'CallExpression',
'ArrowFunction',
'NewExpression',
'BinaryExpression'
])) {
nodeIndent = nodeIndent + indentSize;
}
}
}
else if (!parentVarNode &&
!this.isFirstArrayElementOnSameLine(parent_1) &&
effectiveParent.kind !== ts.SyntaxKind.PropertyAccessExpression &&
effectiveParent.kind !== ts.SyntaxKind.ExpressionStatement &&
effectiveParent.kind !== ts.SyntaxKind.PropertyAssignment &&
!(this.isAssignment(effectiveParent))) {
nodeIndent = nodeIndent + indentSize;
}
elementsIndent = nodeIndent + indentSize;
this.checkFirstNodeLineIndent(node, nodeIndent);
}
else {
nodeIndent = this.getNodeIndent(node).goodChar;
elementsIndent = nodeIndent + indentSize;
}
if (parentVarNode && this.isNodeInVarOnTop(node, parentVarNode)) {
varKind = parentVarNode.parent.getFirstToken().getText();
elementsIndent += indentSize * OPTIONS.VariableDeclarator[varKind];
}
this.checkNodesIndent(elements, elementsIndent);
if (elements.length > 0) {
var lastLine = this.getLine(elements[elements.length - 1], true);
if (lastLine === nodeEndLine) {
return;
}
}
this.checkLastNodeLineIndent(node, elementsIndent - indentSize);
};
IndentWalker.prototype.isFirstArrayElementOnSameLine = function (node) {
if (isKind(node, 'ArrayLiteralExpression')) {
var ele = node.elements[0];
if (ele) {
return isKind(ele, 'ObjectLiteralExpression') && this.getLine(ele) === this.getLine(node);
}
}
return false;
};
IndentWalker.prototype.isNodeInVarOnTop = function (node, varNode) {
var nodeLine = this.getLine(node);
var parentLine = this.getLine(varNode.parent);
return varNode &&
parentLine === nodeLine &&
varNode.parent.declarations.length > 1;
};
IndentWalker.prototype.blockLessNodes = function (node) {
if (!isKind(node.statement, 'Block')) {
this.blockIndentationCheck(node);
}
};
IndentWalker.prototype.checkIndentInVariableDeclarations = function (node) {
var indent = this.expectedVarIndent(node);
this.checkNodeIndent(node, indent);
};
IndentWalker.prototype.visitCase = function (node) {
if (this.isSingleLineNode(node)) {
return;
}
var caseIndent = this.expectedCaseIndent(node);
this.checkNodesIndent(node.statements, caseIndent + indentSize);
};
IndentWalker.prototype.visitClassDeclaration = function (node) {
var len = node.getChildCount();
this.blockIndentationCheck(node.getChildAt(len - 2));
_super.prototype.visitClassDeclaration.call(this, node);
};
IndentWalker.prototype.visitClassExpression = function (node) {
var len = node.getChildCount();
this.blockIndentationCheck(node.getChildAt(len - 2));
_super.prototype.visitClassExpression.call(this, node);
};
IndentWalker.prototype.visitBlock = function (node) {
this.blockIndentationCheck(node);
_super.prototype.visitBlock.call(this, node);
};
IndentWalker.prototype.visitIfStatement = function (node) {
var thenLine = this.getLine(node.thenStatement);
var line = this.getLine(node);
if (node.thenStatement.kind !== ts.SyntaxKind.Block && thenLine > line) {
this.blockIndentationCheck(node);
}
_super.prototype.visitIfStatement.call(this, node);
};
IndentWalker.prototype.visitObjectLiteralExpression = function (node) {
this.checkIndentInArrayOrObjectBlock(node);
_super.prototype.visitObjectLiteralExpression.call(this, node);
};
IndentWalker.prototype.visitArrayLiteralExpression = function (node) {
this.checkIndentInArrayOrObjectBlock(node);
_super.prototype.visitArrayLiteralExpression.call(this, node);
};
IndentWalker.prototype.visitSwitchStatement = function (node) {
var switchIndent = this.getNodeIndent(node).goodChar;
var caseIndent = this.expectedCaseIndent(node, switchIndent);
this.checkNodesIndent(node.caseBlock.clauses, caseIndent);
this.checkLastNodeLineIndent(node, switchIndent);
_super.prototype.visitSwitchStatement.call(this, node);
};
IndentWalker.prototype.visitCaseClause = function (node) {
this.visitCase(node);
_super.prototype.visitCaseClause.call(this, node);
};
IndentWalker.prototype.visitDefaultClause = function (node) {
this.visitCase(node);
_super.prototype.visitDefaultClause.call(this, node);
};
IndentWalker.prototype.visitWhileStatement = function (node) {
this.blockLessNodes(node);
_super.prototype.visitWhileStatement.call(this, node);
};
IndentWalker.prototype.visitForStatement = function (node) {
this.blockLessNodes(node);
_super.prototype.visitForStatement.call(this, node);
};
IndentWalker.prototype.visitForInStatement = function (node) {
this.blockLessNodes(node);
_super.prototype.visitForInStatement.call(this, node);
};
IndentWalker.prototype.visitDoStatement = function (node) {
this.blockLessNodes(node);
_super.prototype.visitDoStatement.call(this, node);
};
IndentWalker.prototype.visitVariableDeclaration = function (node) {
this.checkIndentInVariableDeclarations(node);
_super.prototype.visitVariableDeclaration.call(this, node);
};
IndentWalker.prototype.visitVariableStatement = function (node) {
_super.prototype.visitVariableStatement.call(this, node);
var list = node.getChildAt(0).getChildAt(1);
if (!list) {
return;
}
var len = list.getChildCount();
var lastElement = list.getChildAt(len - 1);
var lastToken = node.getLastToken();
var lastTokenLine = this.getLine(lastToken, true);
var lastElementLine = this.getLine(lastElement, true);
if (lastTokenLine <= lastElementLine) {
return;
}
var tokenBeforeLastElement = list.getChildAt(len - 2);
if (isKind(tokenBeforeLastElement, 'CommaToken')) {
this.checkLastNodeLineIndent(node, this.getNodeIndent(tokenBeforeLastElement).goodChar);
}
else {
}
};
IndentWalker.prototype.visitFunctionDeclaration = function (node) {
if (this.isSingleLineNode(node)) {
return;
}
if (OPTIONS.FunctionDeclaration.parameters === 'first' && node.parameters.length) {
var indent = this.getLineAndCharacter(node.parameters[0]).character;
this.checkNodesIndent(node.parameters.slice(1), indent);
}
else if (OPTIONS.FunctionDeclaration.parameters !== null) {
this.checkNodesIndent(node.parameters, this.getNodeIndent(node).goodChar + indentSize * OPTIONS.FunctionDeclaration.parameters);
}
_super.prototype.visitFunctionDeclaration.call(this, node);
};
IndentWalker.prototype.visitFunctionExpression = function (node) {
if (this.isSingleLineNode(node)) {
return;
}
if (OPTIONS.FunctionExpression.parameters === 'first' && node.parameters.length) {
var indent = this.getLineAndCharacter(node.parameters[0]).character;
this.checkNodesIndent(node.parameters.slice(1), indent);
}
else if (OPTIONS.FunctionExpression.parameters !== null) {
this.checkNodesIndent(node.parameters, this.getNodeIndent(node).goodChar + indentSize * OPTIONS.FunctionExpression.parameters);
}
_super.prototype.visitFunctionExpression.call(this, node);
};
IndentWalker.prototype.visitPropertyAccessExpression = function (node) {
if (typeof OPTIONS.MemberExpression === 'undefined') {
return;
}
if (this.isSingleLineNode(node)) {
return;
}
if (this.getVariableDeclaratorNode(node)) {
return;
}
var binaryNode = this.getBinaryExpressionNode(node);
if (binaryNode && this.isAssignment(binaryNode)) {
return;
}
var propertyIndent = this.getNodeIndent(node).goodChar + indentSize * OPTIONS.MemberExpression;
var dotToken = node.getChildAt(1);
var checkNodes = [node.name, dotToken];
this.checkNodesIndent(checkNodes, propertyIndent);
_super.prototype.visitPropertyAccessExpression.call(this, node);
};
IndentWalker.prototype.visitSourceFile = function (node) {
this.checkNodesIndent(node.statements, 0);
_super.prototype.visitSourceFile.call(this, node);
};
return IndentWalker;
}(Lint.RuleWalker));
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bGVzL3RlckluZGVudFJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsSUFBWSxFQUFFLFdBQU0sWUFBWSxDQUFDLENBQUE7QUFDakMsSUFBWSxJQUFJLFdBQU0saUJBQWlCLENBQUMsQ0FBQTtBQUV4QyxJQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxJQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUN0QyxJQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUN2QyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDekIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLElBQUksT0FBWSxDQUFDO0FBRWpCLGdCQUFnQixNQUFXO0lBQUUsaUJBQWlCO1NBQWpCLFdBQWlCLENBQWpCLHNCQUFpQixDQUFqQixJQUFpQjtRQUFqQixnQ0FBaUI7O0lBQzVDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBQyxNQUFNO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsZ0JBQWdCLElBQWEsRUFBRSxJQUFZO0lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELGlCQUFpQixJQUFhLEVBQUUsS0FBZTtJQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBakMsQ0FBaUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRDtJQUEwQix3QkFBdUI7SUFBakQ7UUFBMEIsOEJBQXVCO0lBZ0hqRCxDQUFDO0lBSlEsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ3BDLElBQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBOUdhLGFBQVEsR0FBdUI7UUFDM0MsUUFBUSxFQUFFLFlBQVk7UUFDdEIsV0FBVyxFQUFFLGdDQUFnQztRQUM3QyxTQUFTLEVBQUUsT0FBaUIsbUxBRThDLG1NQUYvRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FFOEM7UUFDMUUsa0JBQWtCLEVBQUUsT0FBaUIsa2dFQXlCbEMsMGxFQXpCaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBeUJsQztRQUNILE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLENBQUM7b0JBQ04sSUFBSSxFQUFFLFFBQVE7b0JBQ2QsT0FBTyxFQUFFLEdBQUc7aUJBQ2IsRUFBRTtvQkFDRCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7aUJBQ2QsRUFBRTtvQkFDRCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRSxRQUFROzRCQUNkLE9BQU8sRUFBRSxDQUFDO3lCQUNYO3dCQUNELGtCQUFrQixFQUFFOzRCQUNsQixJQUFJLEVBQUUsUUFBUTs0QkFDZCxVQUFVLEVBQUU7Z0NBQ1YsR0FBRyxFQUFFO29DQUNILElBQUksRUFBRSxRQUFRO29DQUNkLE9BQU8sRUFBRSxDQUFDO2lDQUNYO2dDQUNELEdBQUcsRUFBRTtvQ0FDSCxJQUFJLEVBQUUsUUFBUTtvQ0FDZCxPQUFPLEVBQUUsQ0FBQztpQ0FDWDtnQ0FDRCxLQUFLLEVBQUU7b0NBQ0wsSUFBSSxFQUFFLFFBQVE7b0NBQ2QsT0FBTyxFQUFFLENBQUM7aUNBQ1g7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsYUFBYSxFQUFFOzRCQUNiLElBQUksRUFBRSxRQUFRO3lCQUNmO3dCQUNELG1CQUFtQixFQUFFOzRCQUNuQixJQUFJLEVBQUUsUUFBUTs0QkFDZCxVQUFVLEVBQUU7Z0NBQ1YsVUFBVSxFQUFFO29DQUNWLElBQUksRUFBRSxRQUFRO29DQUNkLE9BQU8sRUFBRSxDQUFDO2lDQUNYO2dDQUNELElBQUksRUFBRTtvQ0FDSixJQUFJLEVBQUUsUUFBUTtvQ0FDZCxPQUFPLEVBQUUsQ0FBQztpQ0FDWDs2QkFDRjt5QkFDRjt3QkFDRCxrQkFBa0IsRUFBRTs0QkFDbEIsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsVUFBVSxFQUFFO2dDQUNWLFVBQVUsRUFBRTtvQ0FDVixJQUFJLEVBQUUsUUFBUTtvQ0FDZCxPQUFPLEVBQUUsQ0FBQztpQ0FDWDtnQ0FDRCxJQUFJLEVBQUU7b0NBQ0osSUFBSSxFQUFFLFFBQVE7b0NBQ2QsT0FBTyxFQUFFLENBQUM7aUNBQ1g7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsZ0JBQWdCLEVBQUU7NEJBQ2hCLElBQUksRUFBRSxRQUFRO3lCQUNmO3FCQUNGO29CQUNELG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCLENBQUM7WUFDRixTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsRUFBRSxDQUFDO1NBQ2I7UUFDRCxjQUFjLEVBQUUsRUFDZjtRQUNELElBQUksRUFBRSxpQkFBaUI7S0FDeEIsQ0FBQztJQU1KLFdBQUM7O0FBQUQsQ0FoSEEsQUFnSEMsQ0FoSHlCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQWdIaEQ7QUFoSFksWUFBSSxPQWdIaEIsQ0FBQTtBQUVEO0lBQTJCLGdDQUFlO0lBTXhDLHNCQUFZLFVBQXlCLEVBQUUsT0FBc0I7UUFDM0Qsa0JBQU0sVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSnJCLG9CQUFlLEdBQThCLEVBQUUsQ0FBQztRQUNoRCxtQkFBYyxHQUE4QixFQUFFLENBQUM7UUFJckQsT0FBTyxHQUFHO1lBQ1IsVUFBVSxFQUFFLENBQUM7WUFDYixrQkFBa0IsRUFBRTtnQkFDbEIsR0FBRyxFQUFFLHVCQUF1QjtnQkFDNUIsR0FBRyxFQUFFLHVCQUF1QjtnQkFDNUIsS0FBSyxFQUFFLHVCQUF1QjthQUMvQjtZQUNELGFBQWEsRUFBRSxJQUFJO1lBQ25CLG1CQUFtQixFQUFFO2dCQUNuQixVQUFVLEVBQUUsd0JBQXdCO2dCQUNwQyxJQUFJLEVBQUUsNEJBQTRCO2FBQ25DO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2xCLFVBQVUsRUFBRSx3QkFBd0I7Z0JBQ3BDLElBQUksRUFBRSw0QkFBNEI7YUFDbkM7U0FDRixDQUFDO1FBQ0YsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDZixVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLFVBQVUsR0FBRyxVQUFVLElBQUksQ0FBQyxDQUFDO1lBQzdCLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFFakQsRUFBRSxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsa0JBQWtCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxDQUFDLGtCQUFrQixHQUFHO29CQUMzQixHQUFHLEVBQUUsV0FBVyxDQUFDLGtCQUFrQjtvQkFDbkMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxrQkFBa0I7b0JBQ25DLEtBQUssRUFBRSxXQUFXLENBQUMsa0JBQWtCO2lCQUN0QyxDQUFDO1lBQ0osQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1lBQ3BELENBQUM7WUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBQzFELENBQUM7WUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVPLHNDQUFlLEdBQXZCLFVBQXdCLEtBQWEsRUFBRSxHQUFXO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTywwQ0FBbUIsR0FBM0IsVUFBNEIsSUFBYSxFQUFFLGFBQThCO1FBQTlCLDZCQUE4QixHQUE5QixxQkFBOEI7UUFDdkUsSUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLDhCQUFPLEdBQWYsVUFBZ0IsSUFBYSxFQUFFLGFBQThCO1FBQTlCLDZCQUE4QixHQUE5QixxQkFBOEI7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7SUFTTyx5Q0FBa0IsR0FBMUIsVUFBMkIsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVO1FBQ2pFLElBQU0saUJBQWlCLEdBQU0sY0FBYyxTQUFJLFVBQVUsSUFBRyxjQUFjLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUUsQ0FBQztRQUM5RixJQUFNLGVBQWUsR0FBRyxXQUFRLFlBQVksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBRSxDQUFDO1FBQ2hFLElBQU0sYUFBYSxHQUFHLFNBQU0sVUFBVSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFFLENBQUM7UUFDMUQsSUFBSSxjQUFjLENBQUM7UUFFbkIsRUFBRSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxjQUFjLEdBQU0sWUFBWSxTQUFJLGVBQWUsYUFBUSxVQUFVLFNBQUksYUFBZSxDQUFDO1FBQzNGLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFHNUIsY0FBYyxHQUFHLFVBQVUsS0FBSyxPQUFPLEdBQUcsWUFBWSxHQUFNLFlBQVksU0FBSSxlQUFpQixDQUFDO1FBQ2hHLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsY0FBYyxHQUFHLFVBQVUsS0FBSyxLQUFLLEdBQUcsVUFBVSxHQUFNLFVBQVUsU0FBSSxhQUFlLENBQUM7UUFDeEYsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUN2QixDQUFDO1FBRUQsTUFBTSxDQUFDLDZCQUEyQixpQkFBaUIsbUJBQWMsY0FBYyxNQUFHLENBQUM7SUFDckYsQ0FBQztJQVNPLDZCQUFNLEdBQWQsVUFBZSxJQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVO1FBQzVELEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRy9CLE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RSxJQUFNLEtBQUssR0FBRyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFNTyx3Q0FBaUIsR0FBekIsVUFBMEIsSUFBYSxFQUFFLGFBQThCO1FBQTlCLDZCQUE4QixHQUE5QixxQkFBOEI7UUFDckUsSUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFRTyxvQ0FBYSxHQUFyQixVQUFzQixJQUFhO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN2QixPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEQsSUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLEtBQUssR0FBRyxFQUFaLENBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMvRCxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLLElBQUksRUFBYixDQUFhLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFOUQsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNuQyxJQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDekYsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLENBQUM7WUFDTCxXQUFXLEVBQUUsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsTUFBTSxJQUFJLFdBQVc7WUFDeEQsS0FBSyxFQUFFLE1BQU07WUFDYixHQUFHLEVBQUUsSUFBSTtZQUNULFFBQVEsRUFBRSxVQUFVLEtBQUssT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJO1lBQ2hELE9BQU8sRUFBRSxVQUFVLEtBQUssT0FBTyxHQUFHLElBQUksR0FBRyxNQUFNO1NBQ2hELENBQUM7SUFDSixDQUFDO0lBRU8sc0NBQWUsR0FBdkIsVUFBd0IsSUFBYSxFQUFFLFlBQW9CO1FBQ3pELElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQ0QsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLHdCQUF3QixDQUFDO1lBQ3ZDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSx5QkFBeUIsQ0FBQztZQUN4QyxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLFlBQVksQ0FBQyxXQUNmLENBQUMsQ0FBQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFNLGFBQWEsR0FBSSxJQUF1QixDQUFDLGFBQWEsQ0FBQztZQUM3RCxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsTUFBTSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBekIsQ0FBeUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2RixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDaEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHVDQUFnQixHQUF4QixVQUF5QixJQUFJO1FBSTNCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBS08sNENBQXFCLEdBQTdCLFVBQThCLElBQWE7UUFDekMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBTSxZQUFZLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBS3RCLElBQU0sd0JBQXdCLEdBQUc7WUFDL0IsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixZQUFZO1NBQ2IsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3BELENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM3QyxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNFLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JELENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixZQUFZLEdBQUcsQ0FBRSxJQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRU8sa0NBQVcsR0FBbkIsVUFBb0IsSUFBSTtRQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBS08sbUNBQVksR0FBcEIsVUFBcUIsSUFBYTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLENBQUUsSUFBNEIsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQ3ZFLENBQUM7SUFLTyxzQ0FBZSxHQUF2QixVQUF3QixJQUFJO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSztZQUN0QyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFHbkYsQ0FBQztJQUtPLCtDQUF3QixHQUFoQyxVQUFpQyxJQUFJLEVBQUUsZUFBZTtRQUNwRCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDNUMsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxlQUFlLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBS08sOENBQXVCLEdBQS9CLFVBQWdDLElBQUksRUFBRSxjQUFjO1FBQ2xELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELElBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDMUMsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxjQUFjLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBS08sa0NBQVcsR0FBbkIsVUFBb0IsSUFBSTtRQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7UUFDbEQsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUd6QixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7UUFHRCxPQUNFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsSUFBSSxDQUN2QyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1lBQ2hELElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVO1lBQzFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQzNDO1lBQ0QsTUFBTSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDO1lBQ25DLE1BQU0sQ0FBQyxJQUFJLEVBQUUseUJBQXlCLENBQUM7WUFDdkMsTUFBTSxDQUFDLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxFQUN2QyxDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQztRQUVELE1BQU0sQ0FBQyxDQUFDLENBQ04sTUFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7SUFNTyxxREFBOEIsR0FBdEMsVUFBdUMsSUFBYTtRQUNsRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLTyxpREFBMEIsR0FBbEMsVUFBbUMsSUFBSTtRQUNyQyxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO1FBRXJELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBRXZDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDNUcsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDckQsQ0FBQztZQUNILENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUN2QyxFQUFFLENBQUMsQ0FDRCxJQUFJLENBQUMsOEJBQThCLENBQUMsVUFBVSxDQUFDO29CQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztvQkFDbkQsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUNwQyxDQUFDLENBQUMsQ0FBQztvQkFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUdELElBQUksY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxjQUFjLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDdEQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLGNBQWMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUNoRSxDQUFDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDakUsY0FBYyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLElBQUksY0FBYyxDQUFDO1FBR3pCLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRCxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBS1MsdUNBQWdCLEdBQTFCLFVBQTJCLEtBQWdCLEVBQUUsTUFBYztRQUEzRCxpQkFFQztRQURDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBbEMsQ0FBa0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFLTyx5Q0FBa0IsR0FBMUIsVUFBMkIsSUFBYSxFQUFFLFlBQXFCO1FBQzdELElBQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3RGLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxVQUFVLENBQUM7UUFFZixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixFQUFFLENBQUMsQ0FBQyxPQUFPLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekQsQ0FBQztZQUVELFVBQVUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFLTyx3Q0FBaUIsR0FBekIsVUFBMEIsSUFBNEIsRUFBRSxTQUFrQjtRQUV4RSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDO1FBRVgsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDckMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ25ELENBQUM7WUFDRCxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEQsTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBTU8sMENBQW1CLEdBQTNCLFVBQStDLElBQWEsRUFBRSxJQUFJO1FBQ2hFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFekIsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxNQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFLUyxnREFBeUIsR0FBbkMsVUFBb0MsSUFBYTtRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUF5QixJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFLUyw4Q0FBdUIsR0FBakMsVUFBa0MsSUFBYTtRQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFzQixJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFLUyxzREFBK0IsR0FBekMsVUFBMEMsSUFBYTtRQUNyRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLHlCQUF5QixDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUcvRixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUk7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFHSCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFHN0MsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUM7UUFDZixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLE9BQU8sQ0FBQztRQUNaLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQU0sUUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsSUFBSSxlQUFlLEdBQUcsUUFBTSxDQUFDO1lBRTdCLEVBQUUsQ0FBQyxDQUFDLFFBQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLGVBQWUsR0FBRyxRQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDekMsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDTixlQUFlLEdBQUcsUUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsQ0FBQztZQUNILENBQUM7WUFFRCxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDMUQsRUFBRSxDQUFDLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDOUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBTSxFQUFFLHFCQUFxQixDQUFDLElBQUksYUFBYSxLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckcsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbEQsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMxRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBTSxFQUFFLHFCQUFxQixDQUFDLElBQUksYUFBYSxLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQzt3QkFDbkYsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3pELFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQy9FLENBQUM7b0JBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNSLE9BQU8sQ0FBQyxRQUFNLEVBQUU7d0JBQ2QseUJBQXlCO3dCQUN6Qix3QkFBd0I7d0JBQ3hCLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGtCQUFrQjtxQkFDbkIsQ0FDSCxDQUFDLENBQUMsQ0FBQzt3QkFDRCxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztvQkFDdkMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDUixDQUFDLGFBQWE7Z0JBQ2QsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsUUFBTSxDQUFDO2dCQUMzQyxlQUFlLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsd0JBQXdCO2dCQUMvRCxlQUFlLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO2dCQUMxRCxlQUFlLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCO2dCQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FDdEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0QsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDdkMsQ0FBQztZQUVELGNBQWMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ3pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQy9DLGNBQWMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzNDLENBQUM7UUFNRCxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekQsY0FBYyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFaEQsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFbkUsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxjQUFjLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUtPLG9EQUE2QixHQUFyQyxVQUFzQyxJQUFhO1FBQ2pELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBTSxHQUFHLEdBQUksSUFBa0MsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBU1MsdUNBQWdCLEdBQTFCLFVBQTJCLElBQWEsRUFBRSxPQUFPO1FBQy9DLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLE9BQU87WUFDWixVQUFVLEtBQUssUUFBUTtZQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFNTyxxQ0FBYyxHQUF0QixVQUF1QixJQUFJO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUtPLHdEQUFpQyxHQUF6QyxVQUEwQyxJQUE0QjtRQUNwRSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUtPLGdDQUFTLEdBQWpCLFVBQWtCLElBQXNDO1FBQ3RELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVTLDRDQUFxQixHQUEvQixVQUFnQyxJQUF5QjtRQUN2RCxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsZ0JBQUssQ0FBQyxxQkFBcUIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsMkNBQW9CLEdBQTlCLFVBQStCLElBQXdCO1FBQ3JELElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxnQkFBSyxDQUFDLG9CQUFvQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxpQ0FBVSxHQUFwQixVQUFxQixJQUFjO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxnQkFBSyxDQUFDLFVBQVUsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRVMsdUNBQWdCLEdBQTFCLFVBQTJCLElBQW9CO1FBQzdDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxnQkFBSyxDQUFDLGdCQUFnQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFUyxtREFBNEIsR0FBdEMsVUFBdUMsSUFBZ0M7UUFDckUsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLGdCQUFLLENBQUMsNEJBQTRCLFlBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVTLGtEQUEyQixHQUFyQyxVQUFzQyxJQUErQjtRQUNuRSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsZ0JBQUssQ0FBQywyQkFBMkIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsMkNBQW9CLEdBQTlCLFVBQStCLElBQXdCO1FBQ3JELElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3ZELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsZ0JBQUssQ0FBQyxvQkFBb0IsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMsc0NBQWUsR0FBekIsVUFBMEIsSUFBbUI7UUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixnQkFBSyxDQUFDLGVBQWUsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRVMseUNBQWtCLEdBQTVCLFVBQTZCLElBQXNCO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsZ0JBQUssQ0FBQyxrQkFBa0IsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRVMsMENBQW1CLEdBQTdCLFVBQThCLElBQXVCO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsZ0JBQUssQ0FBQyxtQkFBbUIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsd0NBQWlCLEdBQTNCLFVBQTRCLElBQXFCO1FBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsZ0JBQUssQ0FBQyxpQkFBaUIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRVMsMENBQW1CLEdBQTdCLFVBQThCLElBQXVCO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsZ0JBQUssQ0FBQyxtQkFBbUIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsdUNBQWdCLEdBQTFCLFVBQTJCLElBQW9CO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsZ0JBQUssQ0FBQyxnQkFBZ0IsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRVMsK0NBQXdCLEdBQWxDLFVBQW1DLElBQTRCO1FBQzdELElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxnQkFBSyxDQUFDLHdCQUF3QixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyw2Q0FBc0IsR0FBaEMsVUFBaUMsSUFBMEI7UUFDekQsZ0JBQUssQ0FBQyxzQkFBc0IsWUFBQyxJQUFJLENBQUMsQ0FBQztRQUduQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLENBQUM7UUFDVCxDQUFDO1FBQ0QsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUd4RCxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztRQUdSLENBQUM7SUFDSCxDQUFDO0lBRVMsK0NBQXdCLEdBQWxDLFVBQW1DLElBQTRCO1FBQzdELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqRixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLGdCQUFnQixDQUNuQixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUN4RixDQUFDO1FBQ0osQ0FBQztRQUVELGdCQUFLLENBQUMsd0JBQXdCLFlBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVTLDhDQUF1QixHQUFqQyxVQUFrQyxJQUEyQjtRQUMzRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEYsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FDdkYsQ0FBQztRQUNKLENBQUM7UUFDRCxnQkFBSyxDQUFDLHVCQUF1QixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxvREFBNkIsR0FBdkMsVUFBd0MsSUFBaUM7UUFDdkUsRUFBRSxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUM7UUFDVCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBTUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBTSxVQUFVLEdBQXdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFJakcsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxnQkFBSyxDQUFDLDZCQUE2QixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFUyxzQ0FBZSxHQUF6QixVQUEwQixJQUFtQjtRQUUzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxnQkFBSyxDQUFDLGVBQWUsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQWwxQkEsQUFrMUJDLENBbDFCMEIsSUFBSSxDQUFDLFVBQVUsR0FrMUJ6QyIsImZpbGUiOiJydWxlcy90ZXJJbmRlbnRSdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9qbWxvcGV6L1dvcmtzcGFjZS90c2xpbnQtZXNsaW50LXJ1bGVzL3NyYyJ9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment