ts-gir
Version:
generate typescript from gir
562 lines (465 loc) • 92.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("core-js/modules/es.array.index-of");
require("core-js/modules/es.array.iterator");
require("core-js/modules/es.array.map");
require("core-js/modules/es.set");
require("core-js/modules/es.string.split");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _babelParserGenerator = _interopRequireDefault(require("babel-parser-generator"));
var _lodash = _interopRequireDefault(require("lodash"));
var _runtime = require("babel-plugin-ts-optchain/lib/runtime");
class GirTSGenerator extends _babelParserGenerator.default {
constructor($namespace, userConfig, logger, moduleName = '') {
super();
this.options = {
plugins: ['jsx', 'typescript'],
sourceType: 'module'
};
this.imports = new Set();
this.isModule = false;
this.moduleTypes = new Set();
this.renamed = {
classes: {},
functions: {}
};
this.$namespace = $namespace;
this.userConfig = userConfig;
this.logger = logger;
this.moduleName = moduleName;
this.isModule = !!moduleName.length;
}
build() {
this.setModulesTypes();
this.buildModules();
this.buildImports(this.imports);
}
setModulesTypes() {
let $constants = (0, _runtime.oc)(this.$namespace, ["constant"], []);
if (!Array.isArray($constants)) {
$constants = [$constants];
}
let $enumerations = (0, _runtime.oc)(this.$namespace, ["enumeration"], []);
if (!Array.isArray($enumerations)) {
$enumerations = [$enumerations];
}
let $aliases = (0, _runtime.oc)(this.$namespace, ["alias"], []);
if (!Array.isArray($aliases)) $aliases = [$aliases];
let $unions = (0, _runtime.oc)(this.$namespace, ["union"], []);
if (!Array.isArray($unions)) $unions = [$unions];
let $classes = (0, _runtime.oc)(this.$namespace, ["class"], []);
if (!Array.isArray($classes)) $classes = [$classes];
let $records = (0, _runtime.oc)(this.$namespace, ["record"], []);
if (!Array.isArray($records)) {
$records = [$records];
}
let $bitfields = (0, _runtime.oc)(this.$namespace, ["bitfield"], []);
if (!Array.isArray($bitfields)) $bitfields = [$bitfields];
let $functions = (0, _runtime.oc)(this.$namespace, ["function"], []);
if (!Array.isArray($functions)) {
$functions = [$functions];
}
let $callbacks = (0, _runtime.oc)(this.$namespace, ["callback"], []);
if (!Array.isArray($callbacks)) {
$callbacks = [$callbacks];
}
$constants.forEach($constant => {
this.moduleTypes.add($constant['@_name']);
});
$aliases.forEach($alias => {
this.moduleTypes.add($alias['@_name']);
});
$unions.forEach($union => {
this.moduleTypes.add($union['@_name']);
});
$enumerations.forEach($enumeration => {
this.moduleTypes.add($enumeration['@_name']);
});
$classes.forEach($class => {
this.moduleTypes.add($class['@_name']);
});
$bitfields.forEach($bitfield => {
this.moduleTypes.add($bitfield['@_name']);
});
$records.forEach($record => {
this.moduleTypes.add($record['@_name']);
});
$functions.forEach($function => {
this.moduleTypes.add($function['@_name']);
});
$callbacks.forEach($callback => {
this.moduleTypes.add($callback['@_name']);
});
}
buildModules(path = '') {
const count = this.isModule ? this.append(`declare module '${this.moduleName}' {}`, path) : 0;
this.buildConstantDeclarations((0, _runtime.oc)(this.$namespace, ["constant"], []), [path, this.isModule ? count - 1 : '']);
this.buildEnumDeclarations((0, _runtime.oc)(this.$namespace, ["enumeration"], []), [path, this.isModule ? count - 1 : '']);
this.buildEnumDeclarations((0, _runtime.oc)(this.$namespace, ["bitfield"], []), [path, this.isModule ? count - 1 : '']);
this.buildTypeDeclarations((0, _runtime.oc)(this.$namespace, ["alias"], []), [path, this.isModule ? count - 1 : '']);
this.buildTypeDeclarations((0, _runtime.oc)(this.$namespace, ["union"], []), [path, this.isModule ? count - 1 : '']);
this.buildInterfaceDeclarations((0, _runtime.oc)(this.$namespace, ["interface"], []), [path, this.isModule ? count - 1 : '']);
this.buildClassDeclarations((0, _runtime.oc)(this.$namespace, ["class"], []), [path, this.isModule ? count - 1 : '']);
this.buildClassDeclarations((0, _runtime.oc)(this.$namespace, ["record"], []), [path, this.isModule ? count - 1 : '']);
this.buildFunctionDeclarations((0, _runtime.oc)(this.$namespace, ["function"], []), [path, this.isModule ? count - 1 : '']);
this.buildCallbackDeclarations((0, _runtime.oc)(this.$namespace, ["callback"], []), [path, this.isModule ? count - 1 : '']);
}
buildImports(imports, path = '') {
imports.forEach(importName => {
let importPath = this.userConfig.importMap[_lodash.default.kebabCase(importName)];
if (!importPath) importPath = `./${_lodash.default.kebabCase(importName)}`;
this.prepend(`import * as ${importName} from '${importPath}'`, path);
this.logger.warn(`importing '${importName}' from '${importPath}'`);
});
}
buildTypeDeclarations($aliasesOrUnions, path = '') {
if (!Array.isArray($aliasesOrUnions)) $aliasesOrUnions = [$aliasesOrUnions];
$aliasesOrUnions.forEach($aliasOrUnion => {
const typeName = $aliasOrUnion['@_name'];
let types = $aliasOrUnion;
if ($aliasOrUnion.field) {
types = $aliasOrUnion.field;
}
if (!Array.isArray(types)) types = [types];
const typeString = _lodash.default.uniq(types.map(t => this.getType(t))).join(' | ');
this.append(`export type ${typeName} = ${typeString}`, [path, this.isModule ? 'body.body' : '']);
});
}
buildEnumDeclarations($enumerations, path = '') {
if (!Array.isArray($enumerations)) $enumerations = [$enumerations];
$enumerations.forEach($enumeration => {
const enumName = $enumeration['@_name'];
const count = this.append(`export enum ${enumName} {}`, [path, this.isModule ? 'body.body' : '']);
this.buildEnumDeclarationMembers((0, _runtime.oc)($enumeration, ["member"], []), [path, this.isModule ? 'body.body' : '', count - 1]);
});
}
buildEnumDeclarationMembers($members, path = '') {
if (!Array.isArray($members)) $members = [$members];
$members.forEach($member => {
const identifierName = $member['@_c:identifier'];
this.append(`enum E {${identifierName}}`, [path, 'declaration.members'], 'members.0');
});
}
buildConstantDeclarations($constants, path = '') {
if (!Array.isArray($constants)) $constants = [$constants];
$constants.forEach($constant => {
const constantName = $constant['@_name'];
const constantType = this.getType($constant);
this.append(`export const ${constantName}: ${constantType};`, [path, this.isModule ? 'body.body' : '']);
});
}
buildFunctionDeclarations($functions, path = '') {
if (!Array.isArray($functions)) $functions = [$functions];
$functions.forEach($function => {
const returnType = this.getType($function['return-value']);
let functionName = $function['@_name'];
if (this.isReservedKeyword(functionName)) {
functionName = `g_${functionName}`;
this.renamed.functions[$function['@_name']] = functionName;
this.logger.warn(`function '${$function['@_name']}' renamed to '${functionName}'`);
}
const count = this.append(`export function ${functionName}(): ${returnType}`, [path, this.isModule ? 'body.body' : '']);
this.buildFunctionParams((0, _runtime.oc)($function, ["parameters", "parameter"], []), [path, this.isModule ? 'body.body' : '', count - 1, 'declaration.params']);
});
}
buildCallbackDeclarations($callbacks, path = '') {
if (!Array.isArray($callbacks)) {
this.logger.warn(`$callbacks is not an array: ${JSON.stringify($callbacks, null, 2)}`);
return;
}
$callbacks.forEach($callback => {
const returnType = this.getType($callback['return-value']);
const callbackName = $callback['@_name'];
const count = this.append(`export type ${callbackName} = () => ${returnType}`, [path, this.isModule ? 'body.body' : '']);
this.buildFunctionParams((0, _runtime.oc)($callback, ["parameters", "parameter"], []), [path, this.isModule ? 'body.body' : '', count - 1, 'declaration.typeAnnotation.parameters']);
});
}
buildFunctionParams($parameters, path = '') {
if (!Array.isArray($parameters)) $parameters = [$parameters];
let paramRequired = true;
$parameters.forEach($parameter => {
let paramName = this.safeWord($parameter['@_name']);
let paramType = this.getType($parameter);
if (paramName === 'arguments' || paramName === 'eval') {
paramName = `_${paramName}`;
paramRequired = !paramRequired ? false : $parameter['@_optional'] !== '1';
} else if (paramName === '...') {
paramName = '...args';
paramRequired = true;
paramType = this.getType($parameter, {
isArray: true
});
}
if (paramType) {
// TODO: some param types not supported
this.append(`function f(${paramName}${paramRequired ? '' : '?'}: ${paramType}) {}`, path, 'params.0');
}
});
}
buildInterfaceDeclarations($interfaces, path = '') {
if (!Array.isArray($interfaces)) $interfaces = [$interfaces];
return $interfaces.forEach($interface => {
const interfaceName = $interface['@_name'];
const count = this.append(`export interface ${interfaceName} {}`, [path, this.isModule ? 'body.body' : '']);
this.buildPropertyDeclarations((0, _runtime.oc)($interface, ["property"], []), [path, this.isModule ? 'body.body' : '', count - 1], $interface);
this.buildMethodDeclarations((0, _runtime.oc)($interface, ["method"], []), [path, this.isModule ? 'body.body' : '', count - 1], $interface);
});
}
buildClassDeclarations($classes, path = '') {
if (!$classes.forEach) {
return undefined;
}
return $classes.forEach($class => {
let className = $class['@_name'];
let parentClassName = $class['@_parent'];
if (parentClassName) {
const parentClassNameSplit = parentClassName.split('.');
if (parentClassNameSplit.length > 1 && parentClassNameSplit[0] !== this.$namespace['@_name']) {
this.imports.add(parentClassNameSplit[0]);
}
}
if (this.isReservedKeyword(className)) {
this.logger.warn(`parent class '${className}' renamed to 'g_${className}'`);
className = `g_${className}`;
}
if (this.isReservedKeyword(parentClassName)) {
this.logger.warn(`parent class '${parentClassName}' renamed to 'g_${parentClassName}'`);
parentClassName = `g_${parentClassName}`;
}
const count = this.append(`export class ${className} ${parentClassName ? `extends ${parentClassName} ` : ''}{}`, [path, this.isModule ? 'body.body' : '']);
this.buildConstructorDeclaration((0, _runtime.oc)($class, ["constructor"], []), [path, this.isModule ? 'body.body' : '', count - 1]);
this.buildPropertyDeclarations((0, _runtime.oc)($class, ["property"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class);
this.buildPropertyDeclarations((0, _runtime.oc)($class, ["field"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class, true);
this.buildMethodDeclarations((0, _runtime.oc)($class, ["method"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class);
this.buildMethodDeclarations((0, _runtime.oc)($class, ['virtual-method'], []), [path, this.isModule ? 'body.body' : '', count - 1], $class);
this.buildMethodDeclarations((0, _runtime.oc)($class, ["function"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class, true);
});
}
getClassIdentifiers($class, recursive = true) {
const result = {};
if (!$class) return result;
const $parentClass = _lodash.default.find((0, _runtime.oc)(this.$namespace, ["class"], []), $namespaceClass => $namespaceClass['@_name'] === $class['@_parent'] && typeof $namespaceClass['@_name'] === 'object');
let $properties = (0, _runtime.oc)($class, ["property"], []);
if (!Array.isArray($properties)) {
$properties = [$properties];
}
let $methods = (0, _runtime.oc)($class, ["method"], []);
if (!Array.isArray($methods)) $methods = [$methods];
let $fields = (0, _runtime.oc)($class, ["field"], []);
if (!Array.isArray($fields)) $fields = [$fields];
let $functions = (0, _runtime.oc)($class, ["function"], []);
if (!Array.isArray($functions)) {
$functions = [$functions];
}
let $virtualMethods = (0, _runtime.oc)($class, ['virtual-method'], []);
if (!Array.isArray($virtualMethods)) {
$virtualMethods = [$virtualMethods];
}
const parentClassIdentifiers = $parentClass ? Object.keys(this.getClassIdentifiers($parentClass)) : [];
const identifiers = [...(recursive ? parentClassIdentifiers : []), ...$fields.map($field => $field['@_name']), ...$functions.map($function => $function['@_name']), ...$methods.map($method => $method['@_name']), ...$properties.map($property => $property['@_name']), ...$virtualMethods.map($method => $method['@_name'])];
identifiers.forEach(identifier => {
result[identifier] = result[identifier] ? ++result[identifier] : 1;
});
return result;
}
getParentClassIdentifiers($class, recursive = true) {
if (!$class) return {};
const $parentClass = _lodash.default.find((0, _runtime.oc)(this.$namespace, ["class"], []), $namespaceClass => $namespaceClass['@_name'] === $class['@_parent']);
if (!$parentClass) return {};
return this.getClassIdentifiers($parentClass, recursive);
}
buildMethodDeclarations($methods, path = '', $class, isStatic = false) {
if (!Array.isArray($methods)) $methods = [$methods];
const parentClassIdentifiers = this.getParentClassIdentifiers($class);
const classIdentifiers = this.getClassIdentifiers($class, false);
$methods.forEach($method => {
let methodName = $method['@_name'];
if (this.isReservedKeyword(methodName) || methodName === 'constructor') {
methodName = `g_${methodName}`;
if ($class) {
if (!this.renamed.classes[$class['@_name']]) {
this.renamed.classes[$class['@_name']] = {};
}
this.renamed.classes[$class['@_name']][$method['@_name']] = methodName;
}
this.logger.warn(`method '${$method['@_name']}' renamed to '${methodName}'${$class ? ` in class '${$class['@_name']}'` : ''}`);
} else if (!methodName.length) {
this.logger.warn(`empty method name${$class ? ` in class '${$class['@_name']}'` : ''}`);
return true;
}
if (this.userConfig.ignoreDuplicates && (parentClassIdentifiers[methodName] || classIdentifiers[methodName] > 1)) {
this.logger.warn(`duplicate method '${methodName}' ignored${$class ? ` in class '${$class['@_name']}'` : ''}`);
} else {
const duplicate = parentClassIdentifiers[methodName] || classIdentifiers[methodName] > 1;
const returnType = this.getType($method['return-value']);
if (duplicate) {
this.append(`class Class {${isStatic ? 'static ' : ''}${methodName}(...args: any[]): any}`, [path, 'declaration.body.body'], 'body.body');
} else {
const count = this.append(`class Class {${isStatic ? 'static ' : ''}${methodName}(): ${returnType}}`, [path, 'declaration.body.body'], 'body.body');
this.buildMethodDeclarationParams((0, _runtime.oc)($method, ["parameters", "parameter"], []), [path, 'declaration.body.body', count - 1]);
}
}
return true;
});
}
buildConstructorDeclaration($constructors, path = '') {
let $constructor = $constructors;
if (Array.isArray($constructors)) {
if ($constructors.length) {
$constructor = $constructors[0];
}
}
if (!$constructor['@_name']) return;
const count = this.append('class C {constructor()}', [path, 'declaration.body.body'], 'body.body.0');
this.buildFunctionParams((0, _runtime.oc)($constructor, ["parameters", "parameter"], []), [path, 'declaration.body.body', count - 1, 'params']);
}
buildMethodDeclarationParams($parameters, path = '') {
if (!Array.isArray($parameters)) $parameters = [$parameters];
let paramRequired = true;
$parameters.forEach($parameter => {
let paramName = this.safeWord($parameter['@_name']);
let paramType = this.getType($parameter);
if (paramName === 'arguments' || paramName === 'eval') {
paramName = `_${paramName}`;
} else if (paramName === '...') {
paramName = '...args';
paramRequired = true;
paramType = this.getType($parameter, {
isArray: true
});
}
paramRequired = !paramRequired ? false : $parameter['@_optional'] !== '1';
if (paramType && paramName !== '...') {
// TODO: some param types not supported
this.append(`function f(${paramName}${paramRequired ? '' : '?'}: ${paramType}) {}`, [path, 'params'], 'params.0');
}
});
}
buildPropertyDeclarations($properties, path = '', $class, isStatic = false) {
if (!Array.isArray($properties)) $properties = [$properties];
const parentClassIdentifiers = this.getParentClassIdentifiers($class);
const classIdentifiers = this.getClassIdentifiers($class, false);
$properties.forEach($property => {
let propertyName = $property['@_name'];
if (this.isReservedKeyword(propertyName) || propertyName === 'constructor') {
propertyName = `g_${propertyName}`;
if ($class) {
if (!this.renamed.classes[$class['@_name']]) {
this.renamed.classes[$class['@_name']] = {};
}
this.renamed.classes[$class['@_name']][$property['@_name']] = propertyName;
}
this.logger.warn(`property '${$property['@_name']}' renamed to '${propertyName}'${$class ? ` in class '${$class['@_name']}'` : ''}`);
}
if (this.userConfig.ignoreDuplicates && (parentClassIdentifiers[propertyName] || classIdentifiers[propertyName] > 1)) {
this.logger.warn(`duplicate property '${propertyName}' ignored`);
} else {
const duplicate = parentClassIdentifiers[propertyName] || classIdentifiers[propertyName] > 1;
const propertyType = this.getType($property);
if (duplicate) {
this.append(`class Class {${isStatic ? 'static ' : ''}${propertyName.indexOf('-') > -1 ? `'${propertyName}'` : propertyName}: any}`, [path, 'declaration.body.body'], 'body.body.0');
} else {
this.append(`class Class {${isStatic ? 'static ' : ''}${propertyName.indexOf('-') > -1 ? `'${propertyName}'` : propertyName}: ${propertyType}}`, [path, 'declaration.body.body'], 'body.body.0');
}
}
});
}
getType(girType, options = {
isArray: null,
nullable: null
}) {
let isArray = options.isArray,
nullable = options.nullable;
if (typeof isArray === 'undefined') isArray = null;
if (typeof nullable === 'undefined') nullable = null;
const girTypeStrict = girType; // TODO: some param types not supported
let girTypeStr = '';
let knownType = null;
if (typeof girTypeStrict !== 'string') {
if (girTypeStrict.array) {
if (isArray === null) isArray = true;
girTypeStr = (0, _runtime.oc)(girTypeStrict, ["array", "type", '@_name'], '').toString();
nullable = (0, _runtime.oc)(girTypeStrict, ['@_nullable']) === '1' && (0, _runtime.oc)(girTypeStrict, ['@_optional']) !== '1';
} else if (girTypeStrict.callback) {
const returnType = this.getType(girTypeStrict.callback['return-value']);
const girTypescriptGenerator = new GirTSGenerator(this.$namespace, this.userConfig, this.logger, this.moduleName);
girTypescriptGenerator.append(`type T = () => ${returnType}`, '', 'typeAnnotation');
girTypescriptGenerator.moduleTypes = this.moduleTypes;
girTypescriptGenerator.buildFunctionParams((0, _runtime.oc)(girTypeStrict, ["callback", "parameters", "parameter"], []), ['0', 'parameters']);
knownType = girTypescriptGenerator.generate();
} else if (girTypeStrict.type) {
girTypeStr = (0, _runtime.oc)(girTypeStrict, ["type", '@_name'], '').toString();
nullable = (0, _runtime.oc)(girTypeStrict, ['@_nullable']) === '1' && (0, _runtime.oc)(girTypeStrict, ['@_optional']) !== '1';
} else {
knownType = 'any';
}
}
if (isArray === null) isArray = false;
if (nullable === null) nullable = false;
girTypeStr = girTypeStr.split(' ').pop() || '';
if (!girTypeStr && !knownType) knownType = 'any';
let array = '';
if (isArray) array = '[]';
if (knownType) {
if (knownType.indexOf(' ') > -1 && array.length) {
knownType = `(${knownType})`;
}
knownType = `${knownType}${array}`;
return knownType;
}
let tsType = {
'': `any${array}`,
double: `number${array}`,
gboolean: `boolean${array}`,
gchar: `number${array}`,
gdouble: `number${array}`,
gfloat: `number${array}`,
gint16: `number${array}`,
gint32: `number${array}`,
gint64: `number${array}`,
gint8: `number${array}`,
gint: `number${array}`,
glong: `number${array}`,
gpointer: `object${array}`,
gsize: `number${array}`,
gssize: `number${array}`,
guint16: `number${array}`,
guint32: `number${array}`,
guint64: `number${array}`,
guint8: `number${array}`,
guint: `number${array}`,
gulong: `number${array}`,
gunichar: `number${array}`,
gushort: `number${array}`,
long: `number${array}`,
none: `void${array}`,
object: `any${array}`,
utf8: `string${array}`,
va_list: `any${array}`
}[girTypeStr];
if (!tsType) {
const moduleName = this.$namespace['@_name'];
let moduleType = girTypeStr;
const girTypeStrSplit = girTypeStr.split('.');
if (girTypeStrSplit[0] === moduleName) {
moduleType = girTypeStrSplit.pop() || girTypeStr;
}
if (this.moduleTypes.has(moduleType)) {
tsType = moduleType + array;
} else if (girTypeStrSplit.length > 1) {
this.imports.add(girTypeStrSplit[0]);
tsType = girTypeStr + array;
} else {
this.logger.warn(`unknown type '${moduleType}' set to 'any'`);
tsType = `any${array}`;
}
}
if (nullable) tsType = `${tsType} | null`;
return tsType;
}
}
exports.default = GirTSGenerator;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9HaXJUU0dlbmVyYXRvci50cyJdLCJuYW1lcyI6WyJHaXJUU0dlbmVyYXRvciIsIkJhYmVsUGFyc2VyR2VuZXJhdG9yIiwiY29uc3RydWN0b3IiLCIkbmFtZXNwYWNlIiwidXNlckNvbmZpZyIsImxvZ2dlciIsIm1vZHVsZU5hbWUiLCJvcHRpb25zIiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJpbXBvcnRzIiwiU2V0IiwiaXNNb2R1bGUiLCJtb2R1bGVUeXBlcyIsInJlbmFtZWQiLCJjbGFzc2VzIiwiZnVuY3Rpb25zIiwibGVuZ3RoIiwiYnVpbGQiLCJzZXRNb2R1bGVzVHlwZXMiLCJidWlsZE1vZHVsZXMiLCJidWlsZEltcG9ydHMiLCIkY29uc3RhbnRzIiwib2MiLCJBcnJheSIsImlzQXJyYXkiLCIkZW51bWVyYXRpb25zIiwiJGFsaWFzZXMiLCIkdW5pb25zIiwiJGNsYXNzZXMiLCIkcmVjb3JkcyIsIiRiaXRmaWVsZHMiLCIkZnVuY3Rpb25zIiwiJGNhbGxiYWNrcyIsImZvckVhY2giLCIkY29uc3RhbnQiLCJhZGQiLCIkYWxpYXMiLCIkdW5pb24iLCIkZW51bWVyYXRpb24iLCIkY2xhc3MiLCIkYml0ZmllbGQiLCIkcmVjb3JkIiwiJGZ1bmN0aW9uIiwiJGNhbGxiYWNrIiwicGF0aCIsImNvdW50IiwiYXBwZW5kIiwiYnVpbGRDb25zdGFudERlY2xhcmF0aW9ucyIsImJ1aWxkRW51bURlY2xhcmF0aW9ucyIsImJ1aWxkVHlwZURlY2xhcmF0aW9ucyIsImJ1aWxkSW50ZXJmYWNlRGVjbGFyYXRpb25zIiwiYnVpbGRDbGFzc0RlY2xhcmF0aW9ucyIsImJ1aWxkRnVuY3Rpb25EZWNsYXJhdGlvbnMiLCJidWlsZENhbGxiYWNrRGVjbGFyYXRpb25zIiwiaW1wb3J0TmFtZSIsImltcG9ydFBhdGgiLCJpbXBvcnRNYXAiLCJfIiwia2ViYWJDYXNlIiwicHJlcGVuZCIsIndhcm4iLCIkYWxpYXNlc09yVW5pb25zIiwiJGFsaWFzT3JVbmlvbiIsInR5cGVOYW1lIiwidHlwZXMiLCJmaWVsZCIsInR5cGVTdHJpbmciLCJ1bmlxIiwibWFwIiwidCIsImdldFR5cGUiLCJqb2luIiwiZW51bU5hbWUiLCJidWlsZEVudW1EZWNsYXJhdGlvbk1lbWJlcnMiLCIkbWVtYmVycyIsIiRtZW1iZXIiLCJpZGVudGlmaWVyTmFtZSIsImNvbnN0YW50TmFtZSIsImNvbnN0YW50VHlwZSIsInJldHVyblR5cGUiLCJmdW5jdGlvbk5hbWUiLCJpc1Jlc2VydmVkS2V5d29yZCIsImJ1aWxkRnVuY3Rpb25QYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiY2FsbGJhY2tOYW1lIiwiJHBhcmFtZXRlcnMiLCJwYXJhbVJlcXVpcmVkIiwiJHBhcmFtZXRlciIsInBhcmFtTmFtZSIsInNhZmVXb3JkIiwicGFyYW1UeXBlIiwiJGludGVyZmFjZXMiLCIkaW50ZXJmYWNlIiwiaW50ZXJmYWNlTmFtZSIsImJ1aWxkUHJvcGVydHlEZWNsYXJhdGlvbnMiLCJidWlsZE1ldGhvZERlY2xhcmF0aW9ucyIsInVuZGVmaW5lZCIsImNsYXNzTmFtZSIsInBhcmVudENsYXNzTmFtZSIsInBhcmVudENsYXNzTmFtZVNwbGl0Iiwic3BsaXQiLCJidWlsZENvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCJnZXRDbGFzc0lkZW50aWZpZXJzIiwicmVjdXJzaXZlIiwicmVzdWx0IiwiJHBhcmVudENsYXNzIiwiZmluZCIsIiRuYW1lc3BhY2VDbGFzcyIsIiRwcm9wZXJ0aWVzIiwiJG1ldGhvZHMiLCIkZmllbGRzIiwiJHZpcnR1YWxNZXRob2RzIiwicGFyZW50Q2xhc3NJZGVudGlmaWVycyIsIk9iamVjdCIsImtleXMiLCJpZGVudGlmaWVycyIsIiRmaWVsZCIsIiRtZXRob2QiLCIkcHJvcGVydHkiLCJpZGVudGlmaWVyIiwiZ2V0UGFyZW50Q2xhc3NJZGVudGlmaWVycyIsImlzU3RhdGljIiwiY2xhc3NJZGVudGlmaWVycyIsIm1ldGhvZE5hbWUiLCJpZ25vcmVEdXBsaWNhdGVzIiwiZHVwbGljYXRlIiwiYnVpbGRNZXRob2REZWNsYXJhdGlvblBhcmFtcyIsIiRjb25zdHJ1Y3RvcnMiLCIkY29uc3RydWN0b3IiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJpbmRleE9mIiwiZ2lyVHlwZSIsIm51bGxhYmxlIiwiZ2lyVHlwZVN0cmljdCIsImdpclR5cGVTdHIiLCJrbm93blR5cGUiLCJhcnJheSIsInRvU3RyaW5nIiwiY2FsbGJhY2siLCJnaXJUeXBlc2NyaXB0R2VuZXJhdG9yIiwiZ2VuZXJhdGUiLCJ0eXBlIiwicG9wIiwidHNUeXBlIiwiZG91YmxlIiwiZ2Jvb2xlYW4iLCJnY2hhciIsImdkb3VibGUiLCJnZmxvYXQiLCJnaW50MTYiLCJnaW50MzIiLCJnaW50NjQiLCJnaW50OCIsImdpbnQiLCJnbG9uZyIsImdwb2ludGVyIiwiZ3NpemUiLCJnc3NpemUiLCJndWludDE2IiwiZ3VpbnQzMiIsImd1aW50NjQiLCJndWludDgiLCJndWludCIsImd1bG9uZyIsImd1bmljaGFyIiwiZ3VzaG9ydCIsImxvbmciLCJub25lIiwib2JqZWN0IiwidXRmOCIsInZhX2xpc3QiLCJtb2R1bGVUeXBlIiwiZ2lyVHlwZVN0clNwbGl0IiwiaGFzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBMkJlLE1BQU1BLGNBQU4sU0FBNkJDLDZCQUE3QixDQUFrRDtBQWlCL0RDLEVBQUFBLFdBQVcsQ0FDRkMsVUFERSxFQUVGQyxVQUZFLEVBR0ZDLE1BSEUsRUFJRkMsVUFBVSxHQUFHLEVBSlgsRUFLVDtBQUNBO0FBREEsU0FyQkZDLE9BcUJFLEdBckJ1QjtBQUN2QkMsTUFBQUEsT0FBTyxFQUFFLENBQUMsS0FBRCxFQUFRLFlBQVIsQ0FEYztBQUV2QkMsTUFBQUEsVUFBVSxFQUFFO0FBRlcsS0FxQnZCO0FBQUEsU0FoQkZDLE9BZ0JFLEdBaEJxQixJQUFJQyxHQUFKLEVBZ0JyQjtBQUFBLFNBZEZDLFFBY0UsR0FkUyxLQWNUO0FBQUEsU0FaRkMsV0FZRSxHQVp5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