UNPKG

tslint-consistent-codestyle

Version:

Additional rules to enforce constistent code style with tslint

588 lines 53.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var ts = require("typescript"); var Lint = require("tslint"); var utils = require("tsutils"); var rules_1 = require("../src/rules"); var FORMAT_FAIL = ' name must be in '; var LEADING_FAIL = ' name must not have leading underscore'; var TRAILING_FAIL = ' name must not have trailing underscore'; var NO_LEADING_FAIL = ' name must have leading underscore'; var NO_TRAILING_FAIL = ' name must have trailing underscore'; var REGEX_FAIL = ' name did not match required regex'; var PREFIX_FAIL = ' name must start with '; var SUFFIX_FAIL = ' name must end with '; var PREFIX_FAIL_ARR = ' name must start with one of '; var SUFFIX_FAIL_ARR = ' name must end with one of '; var Types; (function (Types) { Types[Types["default"] = -1] = "default"; Types[Types["variable"] = 1] = "variable"; Types[Types["function"] = 2] = "function"; Types[Types["parameter"] = 4] = "parameter"; Types[Types["member"] = 8] = "member"; Types[Types["property"] = 16] = "property"; Types[Types["parameterProperty"] = 32] = "parameterProperty"; Types[Types["method"] = 64] = "method"; Types[Types["type"] = 128] = "type"; Types[Types["class"] = 256] = "class"; Types[Types["interface"] = 512] = "interface"; Types[Types["typeAlias"] = 1024] = "typeAlias"; Types[Types["genericTypeParameter"] = 2048] = "genericTypeParameter"; Types[Types["enum"] = 4096] = "enum"; Types[Types["enumMember"] = 8192] = "enumMember"; Types[Types["functionVariable"] = 16384] = "functionVariable"; Types[Types["accessor"] = 32768] = "accessor"; })(Types || (Types = {})); var TypeSelector; (function (TypeSelector) { TypeSelector[TypeSelector["variable"] = 1] = "variable"; TypeSelector[TypeSelector["function"] = 3] = "function"; TypeSelector[TypeSelector["functionVariable"] = 16385] = "functionVariable"; TypeSelector[TypeSelector["parameter"] = 5] = "parameter"; TypeSelector[TypeSelector["property"] = 24] = "property"; TypeSelector[TypeSelector["parameterProperty"] = 61] = "parameterProperty"; TypeSelector[TypeSelector["method"] = 72] = "method"; TypeSelector[TypeSelector["class"] = 384] = "class"; TypeSelector[TypeSelector["interface"] = 640] = "interface"; TypeSelector[TypeSelector["typeAlias"] = 1152] = "typeAlias"; TypeSelector[TypeSelector["genericTypeParameter"] = 2176] = "genericTypeParameter"; TypeSelector[TypeSelector["enum"] = 4224] = "enum"; TypeSelector[TypeSelector["enumMember"] = 8216] = "enumMember"; TypeSelector[TypeSelector["accessor"] = 32776] = "accessor"; })(TypeSelector || (TypeSelector = {})); var Modifiers; (function (Modifiers) { Modifiers[Modifiers["const"] = 1] = "const"; Modifiers[Modifiers["readonly"] = 1] = "readonly"; Modifiers[Modifiers["static"] = 2] = "static"; Modifiers[Modifiers["public"] = 4] = "public"; Modifiers[Modifiers["protected"] = 8] = "protected"; Modifiers[Modifiers["private"] = 16] = "private"; Modifiers[Modifiers["global"] = 32] = "global"; Modifiers[Modifiers["local"] = 64] = "local"; Modifiers[Modifiers["abstract"] = 128] = "abstract"; Modifiers[Modifiers["export"] = 256] = "export"; Modifiers[Modifiers["import"] = 512] = "import"; Modifiers[Modifiers["rename"] = 1024] = "rename"; Modifiers[Modifiers["unused"] = 2048] = "unused"; })(Modifiers || (Modifiers = {})); var Specifity; (function (Specifity) { Specifity[Specifity["const"] = 1] = "const"; Specifity[Specifity["readonly"] = 1] = "readonly"; Specifity[Specifity["static"] = 2] = "static"; Specifity[Specifity["global"] = 2] = "global"; Specifity[Specifity["local"] = 2] = "local"; Specifity[Specifity["public"] = 4] = "public"; Specifity[Specifity["protected"] = 4] = "protected"; Specifity[Specifity["private"] = 4] = "private"; Specifity[Specifity["abstract"] = 8] = "abstract"; Specifity[Specifity["export"] = 16] = "export"; Specifity[Specifity["import"] = 32] = "import"; Specifity[Specifity["rename"] = 64] = "rename"; Specifity[Specifity["unused"] = 128] = "unused"; Specifity[Specifity["filter"] = 256] = "filter"; Specifity[Specifity["default"] = 512] = "default"; Specifity[Specifity["variable"] = 1024] = "variable"; Specifity[Specifity["function"] = 1536] = "function"; Specifity[Specifity["functionVariable"] = 1536] = "functionVariable"; Specifity[Specifity["parameter"] = 2048] = "parameter"; Specifity[Specifity["member"] = 2560] = "member"; Specifity[Specifity["property"] = 3072] = "property"; Specifity[Specifity["method"] = 3072] = "method"; Specifity[Specifity["enumMember"] = 3584] = "enumMember"; Specifity[Specifity["parameterProperty"] = 3584] = "parameterProperty"; Specifity[Specifity["type"] = 4096] = "type"; Specifity[Specifity["class"] = 4608] = "class"; Specifity[Specifity["interface"] = 4608] = "interface"; Specifity[Specifity["typeAlias"] = 4608] = "typeAlias"; Specifity[Specifity["genericTypeParameter"] = 4608] = "genericTypeParameter"; Specifity[Specifity["enum"] = 4608] = "enum"; })(Specifity || (Specifity = {})); var Rule = (function (_super) { tslib_1.__extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.prototype.apply = function (sourceFile) { return this.applyWithWalker(new IdentifierNameWalker(sourceFile, this.ruleName, this.ruleArguments.map(function (rule) { return new NormalizedConfig(rule); }).sort(NormalizedConfig.sort))); }; return Rule; }(rules_1.AbstractConfigDependentRule)); exports.Rule = Rule; var NormalizedConfig = (function () { function NormalizedConfig(raw) { this._type = Types[raw.type]; this._final = !!raw.final; this._specifity = Specifity[raw.type]; this._modifiers = 0; if (raw.modifiers !== undefined) { if (Array.isArray(raw.modifiers)) { for (var _i = 0, _a = raw.modifiers; _i < _a.length; _i++) { var modifier = _a[_i]; this._modifiers |= Modifiers[modifier]; this._specifity |= Specifity[modifier]; } } else { this._modifiers = Modifiers[raw.modifiers]; this._specifity |= Specifity[raw.modifiers]; } } if (raw.filter !== undefined) { this._filter = new RegExp(raw.filter); this._specifity |= Specifity.filter; } else { this._filter = undefined; } this._format = raw; } NormalizedConfig.prototype.matches = function (type, modifiers, name) { if (this._final && type > this._type << 1) return false; if ((this._type & type) === 0 || (this._modifiers & ~modifiers) !== 0) return false; if (this._filter === undefined) return true; return this._filter.test(name); }; NormalizedConfig.prototype.getFormat = function () { return this._format; }; NormalizedConfig.sort = function (first, second) { return first._specifity - second._specifity; }; return NormalizedConfig; }()); var NameChecker = (function () { function NameChecker(_type, format) { this._type = _type; this._leadingUnderscore = format.leadingUnderscore; this._trailingUnderscore = format.trailingUnderscore; this._format = parseOptionArray(format.format); this._prefix = parseOptionArray(format.prefix); this._suffix = parseOptionArray(format.suffix); this._regex = format.regex ? new RegExp(format.regex) : undefined; } NameChecker.prototype._failMessage = function (message) { return TypeSelector[this._type] + message; }; NameChecker.prototype.check = function (name, walker) { var identifier = name.text; if (this._regex !== undefined && !this._regex.test(identifier)) walker.addFailureAtNode(name, this._failMessage(REGEX_FAIL)); if (this._leadingUnderscore) { if (identifier[0] === '_') { if (this._leadingUnderscore === 'forbid') walker.addFailureAtNode(name, this._failMessage(LEADING_FAIL)); identifier = identifier.slice(1); } else if (this._leadingUnderscore === 'require') { walker.addFailureAtNode(name, this._failMessage(NO_LEADING_FAIL)); } } if (this._trailingUnderscore) { if (identifier[identifier.length - 1] === '_') { if (this._trailingUnderscore === 'forbid') walker.addFailureAtNode(name, this._failMessage(TRAILING_FAIL)); identifier = identifier.slice(0, -1); } else if (this._trailingUnderscore === 'require') { walker.addFailureAtNode(name, this._failMessage(NO_TRAILING_FAIL)); } } if (this._prefix) { if (Array.isArray(this._prefix)) { identifier = this._checkPrefixes(identifier, name, this._prefix, walker); } else if (identifier.startsWith(this._prefix)) { identifier = identifier.slice(this._prefix.length); } else { walker.addFailureAtNode(name, this._failMessage(PREFIX_FAIL + this._prefix)); } } if (this._suffix) { if (Array.isArray(this._suffix)) { identifier = this._checkSuffixes(identifier, name, this._suffix, walker); } else if (identifier.endsWith(this._suffix)) { identifier = identifier.slice(0, -this._suffix.length); } else { walker.addFailureAtNode(name, this._failMessage(SUFFIX_FAIL + this._suffix)); } } if (this._format) { if (Array.isArray(this._format)) { if (!matchesAnyFormat(identifier, this._format)) walker.addFailureAtNode(name, this._failMessage(FORMAT_FAIL + formatFormatList(this._format))); } else if (!matchesFormat(identifier, this._format)) { walker.addFailureAtNode(name, this._failMessage(FORMAT_FAIL + this._format)); } } }; NameChecker.prototype._checkPrefixes = function (identifier, name, prefixes, walker) { for (var _i = 0, prefixes_1 = prefixes; _i < prefixes_1.length; _i++) { var prefix = prefixes_1[_i]; if (identifier.startsWith(prefix)) return identifier.slice(prefix.length); } walker.addFailureAtNode(name, this._failMessage(PREFIX_FAIL_ARR + prefixes.toString())); return identifier; }; NameChecker.prototype._checkSuffixes = function (identifier, name, suffixes, walker) { for (var _i = 0, suffixes_1 = suffixes; _i < suffixes_1.length; _i++) { var suffix = suffixes_1[_i]; if (identifier.endsWith(suffix)) return identifier.slice(0, -suffix.length); } walker.addFailureAtNode(name, this._failMessage(SUFFIX_FAIL_ARR + suffixes.toString())); return identifier; }; return NameChecker; }()); var IdentifierNameWalker = (function (_super) { tslib_1.__extends(IdentifierNameWalker, _super); function IdentifierNameWalker() { var _this = _super !== null && _super.apply(this, arguments) || this; _this._depth = 0; _this._usage = undefined; return _this; } IdentifierNameWalker.prototype._isUnused = function (name) { if (this._usage === undefined) this._usage = utils.collectVariableUsage(this.sourceFile); return this._usage.get(name).uses.length === 0; }; IdentifierNameWalker.prototype._checkTypeParameters = function (node, modifiers) { if (node.typeParameters !== undefined) for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var name = _a[_i].name; this._checkName(name, TypeSelector.genericTypeParameter, modifiers); } }; IdentifierNameWalker.prototype.visitEnumDeclaration = function (node) { var modifiers = this._getModifiers(node, TypeSelector.enum); this._checkName(node.name, TypeSelector.enum, modifiers); modifiers |= Modifiers.static | Modifiers.public | Modifiers.readonly; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var name = _a[_i].name; if (utils.isIdentifier(name)) this._checkName(name, TypeSelector.enumMember, modifiers); } }; IdentifierNameWalker.prototype.visitTypeAliasDeclaration = function (node) { this._checkDeclaration(node, TypeSelector.typeAlias); this._checkTypeParameters(node, Modifiers.global); }; IdentifierNameWalker.prototype.visitClassLikeDeclaration = function (node) { if (node.name !== undefined) this._checkDeclaration(node, TypeSelector.class); this._checkTypeParameters(node, Modifiers.global); }; IdentifierNameWalker.prototype.visitMethodDeclaration = function (node) { if (isNameIdentifier(node)) this._checkDeclaration(node, TypeSelector.method); this._checkTypeParameters(node, Modifiers.local); }; IdentifierNameWalker.prototype.visitInterfaceDeclaration = function (node) { this._checkDeclaration(node, TypeSelector.interface); this._checkTypeParameters(node, Modifiers.global); }; IdentifierNameWalker.prototype.visitParameterDeclaration = function (node) { var _this = this; if (node.parent.kind === ts.SyntaxKind.IndexSignature) return; if (isNameIdentifier(node)) { if (node.name.originalKeywordKind === ts.SyntaxKind.ThisKeyword) return; var parameterProperty = utils.isParameterProperty(node); this._checkDeclaration(node, parameterProperty ? TypeSelector.parameterProperty : TypeSelector.parameter, utils.isFunctionWithBody(node.parent) && !parameterProperty && this._isUnused(node.name) ? Modifiers.unused : 0); } else { utils.forEachDestructuringIdentifier(node.name, function (declaration) { var modifiers = Modifiers.local; if (!isEqualName(declaration.name, declaration.propertyName)) modifiers |= Modifiers.rename; if (utils.isFunctionWithBody(node.parent) && _this._isUnused(declaration.name)) modifiers |= Modifiers.unused; _this._checkName(declaration.name, TypeSelector.parameter, modifiers); }); } }; IdentifierNameWalker.prototype.visitPropertyDeclaration = function (node) { if (isNameIdentifier(node)) this._checkDeclaration(node, TypeSelector.property); }; IdentifierNameWalker.prototype.visitSetAccessor = function (node) { if (isNameIdentifier(node)) this._checkDeclaration(node, TypeSelector.accessor); }; IdentifierNameWalker.prototype.visitGetAccessor = function (node) { if (isNameIdentifier(node)) this._checkDeclaration(node, TypeSelector.accessor); }; IdentifierNameWalker.prototype._checkVariableDeclarationList = function (list, modifiers) { var _this = this; if ((list.flags & ts.NodeFlags.Const) !== 0) modifiers |= Modifiers.const; utils.forEachDeclaredVariable(list, function (declaration) { var currentModifiers = modifiers; var selector = TypeSelector.variable; if (declaration.kind === ts.SyntaxKind.BindingElement && !isEqualName(declaration.name, declaration.propertyName)) currentModifiers |= Modifiers.rename; if (_this._isUnused(declaration.name)) currentModifiers |= Modifiers.unused; if (isFunctionVariable(declaration)) selector = TypeSelector.functionVariable; _this._checkName(declaration.name, selector, currentModifiers); }); }; IdentifierNameWalker.prototype.visitForStatement = function (node) { if (node.initializer !== undefined && utils.isVariableDeclarationList(node.initializer)) this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable)); }; IdentifierNameWalker.prototype.visitForOfStatement = function (node) { if (utils.isVariableDeclarationList(node.initializer)) this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable)); }; IdentifierNameWalker.prototype.visitForInStatement = function (node) { if (utils.isVariableDeclarationList(node.initializer)) this._checkVariableDeclarationList(node.initializer, this._getModifiers(node.initializer, TypeSelector.variable)); }; IdentifierNameWalker.prototype.visitVariableStatement = function (node) { if (!utils.hasModifier(node.modifiers, ts.SyntaxKind.DeclareKeyword)) this._checkVariableDeclarationList(node.declarationList, this._getModifiers(node, TypeSelector.variable)); }; IdentifierNameWalker.prototype.visitFunction = function (node) { if (node.name !== undefined) this._checkDeclaration(node, TypeSelector.function); this._checkTypeParameters(node, Modifiers.local); }; IdentifierNameWalker.prototype.visitArrowFunction = function (node) { this._checkTypeParameters(node, Modifiers.local); }; IdentifierNameWalker.prototype._checkDeclaration = function (node, type, initialModifiers) { this._checkName(node.name, type, this._getModifiers(node, type, initialModifiers)); }; IdentifierNameWalker.prototype._checkName = function (name, type, modifiers) { var matchingChecker = this._createChecker(type, modifiers, name.text); if (matchingChecker !== null) matchingChecker.check(name, this); }; IdentifierNameWalker.prototype._createChecker = function (type, modifiers, name) { var config = this.options.reduce(function (format, rule) { if (!rule.matches(type, modifiers, name)) return format; return Object.assign(format, rule.getFormat()); }, { leadingUnderscore: undefined, trailingUnderscore: undefined, format: undefined, prefix: undefined, regex: undefined, suffix: undefined, }); if (!config.leadingUnderscore && !config.trailingUnderscore && !config.format && !config.prefix && !config.regex && !config.suffix) return null; return new NameChecker(type, config); }; IdentifierNameWalker.prototype._getModifiers = function (node, type, modifiers) { if (modifiers === void 0) { modifiers = 0; } if (node.modifiers !== undefined) { if (type & Types.member) { if (utils.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword)) { modifiers |= Modifiers.private; } else if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword)) { modifiers |= Modifiers.protected; } else { modifiers |= Modifiers.public; } if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ReadonlyKeyword)) modifiers |= Modifiers.const; if (utils.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword)) modifiers |= Modifiers.static; } if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ConstKeyword)) modifiers |= Modifiers.const; if (utils.hasModifier(node.modifiers, ts.SyntaxKind.ExportKeyword)) modifiers |= Modifiers.export; if (utils.hasModifier(node.modifiers, ts.SyntaxKind.AbstractKeyword)) modifiers |= Modifiers.abstract; } if (type !== TypeSelector.property && type !== TypeSelector.method) modifiers |= this._depth !== 0 ? Modifiers.local : Modifiers.global; return modifiers; }; IdentifierNameWalker.prototype.walk = function (sourceFile) { var _this = this; var cb = function (node) { _this.visitNode(node); if (utils.isScopeBoundary(node)) { ++_this._depth; ts.forEachChild(node, cb); --_this._depth; } else { return ts.forEachChild(node, cb); } }; return ts.forEachChild(sourceFile, cb); }; IdentifierNameWalker.prototype.visitNode = function (node) { switch (node.kind) { case ts.SyntaxKind.VariableStatement: return this.visitVariableStatement(node); case ts.SyntaxKind.FunctionDeclaration: case ts.SyntaxKind.FunctionExpression: return this.visitFunction(node); case ts.SyntaxKind.ForStatement: return this.visitForStatement(node); case ts.SyntaxKind.ForInStatement: return this.visitForInStatement(node); case ts.SyntaxKind.ForOfStatement: return this.visitForOfStatement(node); case ts.SyntaxKind.Parameter: return this.visitParameterDeclaration(node); case ts.SyntaxKind.ClassDeclaration: case ts.SyntaxKind.ClassExpression: return this.visitClassLikeDeclaration(node); case ts.SyntaxKind.InterfaceDeclaration: return this.visitInterfaceDeclaration(node); case ts.SyntaxKind.EnumDeclaration: return this.visitEnumDeclaration(node); case ts.SyntaxKind.TypeAliasDeclaration: return this.visitTypeAliasDeclaration(node); case ts.SyntaxKind.PropertyDeclaration: return this.visitPropertyDeclaration(node); case ts.SyntaxKind.MethodDeclaration: return this.visitMethodDeclaration(node); case ts.SyntaxKind.GetAccessor: return this.visitGetAccessor(node); case ts.SyntaxKind.SetAccessor: return this.visitSetAccessor(node); case ts.SyntaxKind.ArrowFunction: return this.visitArrowFunction(node); } }; return IdentifierNameWalker; }(Lint.AbstractWalker)); function parseOptionArray(option) { if (!Array.isArray(option) || option.length > 1) return option; return option[0]; } function matchesFormat(identifier, format) { switch (format) { case "PascalCase": return isPascalCase(identifier); case "StrictPascalCase": return isStrictPascalCase(identifier); case "camelCase": return isCamelCase(identifier); case "strictCamelCase": return isStrictCamelCase(identifier); case "snake_case": return isSnakeCase(identifier); case "UPPER_CASE": return isUpperCase(identifier); } } function matchesAnyFormat(identifier, formats) { for (var _i = 0, formats_1 = formats; _i < formats_1.length; _i++) { var format = formats_1[_i]; if (matchesFormat(identifier, format)) return true; } return false; } function formatFormatList(formats) { var result = formats[0]; var lastIndex = formats.length - 1; for (var i = 1; i < lastIndex; ++i) result += ', ' + formats[i]; return result + ' or ' + formats[lastIndex]; } function isPascalCase(name) { return name.length === 0 || name[0] === name[0].toUpperCase() && !name.includes('_'); } function isCamelCase(name) { return name.length === 0 || name[0] === name[0].toLowerCase() && !name.includes('_'); } function isStrictPascalCase(name) { return name.length === 0 || name[0] === name[0].toUpperCase() && hasStrictCamelHumps(name, true); } function isStrictCamelCase(name) { return name.length === 0 || name[0] === name[0].toLowerCase() && hasStrictCamelHumps(name, false); } function hasStrictCamelHumps(name, isUpper) { if (name[0] === '_') return false; for (var i = 1; i < name.length; ++i) { if (name[i] === '_') return false; if (isUpper === isUppercaseChar(name[i])) { if (isUpper) return false; } else { isUpper = !isUpper; } } return true; } function isUppercaseChar(char) { return char === char.toUpperCase() && char !== char.toLowerCase(); } function isSnakeCase(name) { return name === name.toLowerCase() && validateUnderscores(name); } function isUpperCase(name) { return name === name.toUpperCase() && validateUnderscores(name); } function validateUnderscores(name) { if (name[0] === '_') return false; var wasUnderscore = false; for (var i = 1; i < name.length; ++i) { if (name[i] === '_') { if (wasUnderscore) return false; wasUnderscore = true; } else { wasUnderscore = false; } } return !wasUnderscore; } function isNameIdentifier(node) { return node.name.kind === ts.SyntaxKind.Identifier; } function isEqualName(name, propertyName) { return propertyName === undefined || (propertyName.kind === ts.SyntaxKind.Identifier && propertyName.text === name.text); } function isFunctionVariable(declaration) { if (declaration.initializer) { switch (declaration.initializer.kind) { case ts.SyntaxKind.ArrowFunction: case ts.SyntaxKind.FunctionExpression: return true; } } return false; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nQ29udmVudGlvblJ1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuYW1pbmdDb252ZW50aW9uUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBaUM7QUFDakMsNkJBQStCO0FBQy9CLCtCQUFpQztBQUVqQyxzQ0FBMkQ7QUFjM0QsSUFBTSxXQUFXLEdBQUssbUJBQW1CLENBQUM7QUFDMUMsSUFBTSxZQUFZLEdBQUksd0NBQXdDLENBQUM7QUFDL0QsSUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUM7QUFDaEUsSUFBTSxlQUFlLEdBQUksb0NBQW9DLENBQUM7QUFDOUQsSUFBTSxnQkFBZ0IsR0FBRyxxQ0FBcUMsQ0FBQztBQUMvRCxJQUFNLFVBQVUsR0FBTSxvQ0FBb0MsQ0FBQztBQUMzRCxJQUFNLFdBQVcsR0FBSyx3QkFBd0IsQ0FBQztBQUMvQyxJQUFNLFdBQVcsR0FBSyxzQkFBc0IsQ0FBQztBQUM3QyxJQUFNLGVBQWUsR0FBSSwrQkFBK0IsQ0FBQztBQUN6RCxJQUFNLGVBQWUsR0FBSSw2QkFBNkIsQ0FBQztBQUl2RCxJQUFLLEtBb0JKO0FBcEJELFdBQUssS0FBSztJQUVOLHdDQUFZLENBQUE7SUFDWix5Q0FBWSxDQUFBO0lBQ1oseUNBQWlCLENBQUE7SUFDakIsMkNBQWtCLENBQUE7SUFDbEIscUNBQWUsQ0FBQTtJQUNmLDBDQUFpQixDQUFBO0lBQ2pCLDREQUEwQixDQUFBO0lBQzFCLHNDQUFlLENBQUE7SUFDZixtQ0FBYSxDQUFBO0lBQ2IscUNBQWMsQ0FBQTtJQUNkLDZDQUFrQixDQUFBO0lBQ2xCLDhDQUFtQixDQUFBO0lBQ25CLG9FQUE4QixDQUFBO0lBQzlCLG9DQUFjLENBQUE7SUFDZCxnREFBb0IsQ0FBQTtJQUNwQiw2REFBMEIsQ0FBQTtJQUMxQiw2Q0FBa0IsQ0FBQTtBQUV0QixDQUFDLEVBcEJJLEtBQUssS0FBTCxLQUFLLFFBb0JUO0FBRUQsSUFBSyxZQWlCSjtBQWpCRCxXQUFLLFlB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