facturacionelectronicapy-recibo-xmlgen
Version:
API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON
524 lines • 47.4 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const xml2js = __importStar(require("xml2js"));
const FechaUtil_service_1 = __importDefault(require("./FechaUtil.service"));
const Constante_service_1 = __importDefault(require("./Constante.service"));
const StringUtil_service_1 = __importDefault(require("./StringUtil.service"));
class JSonEventoMainService {
constructor() {
this.codigoSeguridad = null;
this.codigoControl = null;
this.json = {};
}
/*public generateXMLEvento(params: any, data: any): Promise<any> {
return new Promise((resolve, reject) => {
try {
resolve(this.generateXMLEventoService(params, data));
} catch (error) {
reject(error);
}
});
}*/
generateXMLEventoCancelacion(id, params, data) {
data.tipoEvento = 1; //Cancelacion
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
/*let soapXMLData = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\
<env:Header/>\n\
<env:Body>\n\
<rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\
<dId>${id}</dId>\n\
<dEvReg>${xml}</dEvReg>\n\
</rEnviEventoDe>\n\
</env:Body>\n\
</env:Envelope>\n`;*/
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
generateXMLEventoInutilizacion(id, params, data) {
data.tipoEvento = 2; //Inutilizacion
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
/*let soapXMLData = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\
<env:Header/>\n\
<env:Body>\n\
<rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\
<dId>${id}</dId>\n\
<dEvReg>${xml}</dEvReg>\n\
</rEnviEventoDe>\n\
</env:Body>\n\
</env:Envelope>\n`;
*/
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
generateXMLEventoConformidad(id, params, data) {
data.tipoEvento = 11; //Conformidad
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
generateXMLEventoDisconformidad(id, params, data) {
data.tipoEvento = 12; //Disconformidad
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
generateXMLEventoDesconocimiento(id, params, data) {
data.tipoEvento = 13; //Desconocimiento
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
generateXMLEventoNotificacion(id, params, data) {
data.tipoEvento = 14; //Notificacion
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
let xml = yield this.generateXMLEventoService(params, data);
xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', '');
let soapXMLData = this.envelopeEvent(id, xml);
resolve(soapXMLData);
}
catch (error) {
reject(error);
}
}));
}
envelopeEvent(id, xml) {
return `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\
<env:Header/>\n\
<env:Body>\n\
<rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\
<dId>${id}</dId>\n\
<dEvReg>${xml}</dEvReg>\n\
</rEnviEventoDe>\n\
</env:Body>\n\
</env:Envelope>\n`;
}
/**
* Metodo principal de generacion de XML del Evento
* @param params
* @param data
* @returns
*/
generateXMLEventoService(params, data) {
this.addUnderscore(data);
this.validateValues(data);
this.addDefaultValues(data);
this.json = {};
//this.generateCodigoSeguridad(params, data); //Primero genera el codigo de seguridad aleatorio único
//this.generateCodigoControl(params, data); //Luego genera el código de Control
//this.generateRte(params);
this.json['gGroupGesEve'] = {};
this.json['gGroupGesEve']['rGesEve'] = {};
this.json['gGroupGesEve']['$'] = {};
this.json['gGroupGesEve']['$']['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance';
this.json['gGroupGesEve']['$']['xsi:schemaLocation'] = 'http://ekuatia.set.gov.py/sifen/xsd siRecepEvento_v150.xsd';
this.json['gGroupGesEve']['rGesEve']['rEve'] = {};
this.json['gGroupGesEve']['rGesEve']['rEve']['$'] = {};
this.json['gGroupGesEve']['rGesEve']['rEve']['$']['Id'] = 1;
this.json['gGroupGesEve']['rGesEve']['rEve']['dFecFirma'] = FechaUtil_service_1.default.convertToJSONFormat(new Date());
this.json['gGroupGesEve']['rGesEve']['rEve']['dVerFor'] = params.version;
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = {};
//Emisor
if (data.tipoEvento == 1) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosEmisorCancelacion(params, data);
}
if (data.tipoEvento == 2) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosEmisorInutilizacion(params, data);
}
//if (data.tipoEvento == 3) {
//this.json['gGroupGesEve']['rGesEve']['gGroupTiEvt'] = this.eventos(params, data);
//}
//Receptor (empieza en 11)
if (data.tipoEvento == 11) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorConformidad(params, data);
}
if (data.tipoEvento == 12) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorDisconformidad(params, data);
}
if (data.tipoEvento == 13) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorDesconocimiento(params, data);
}
if (data.tipoEvento == 14) {
this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorNotificacionRecepcion(params, data);
}
var builder = new xml2js.Builder({
xmldec: {
version: '1.0',
encoding: 'UTF-8',
standalone: false,
},
});
var xml = builder.buildObject(this.json);
return this.normalizeXML(xml); //Para firmar tiene que estar normalizado
}
/**
* Valida los datos ingresados en el data del req.body
* @param data
*/
validateValues(data) { }
/**
* Añade algunos valores por defecto al JSON de entrada, valido para
* todas las operaciones
* @param data
*/
addDefaultValues(data) {
/*if (constanteService.tiposEventos.filter((um) => um.codigo === data['tipoEvento']).length == 0) {
throw (
new Error("Tipo de Evento '" + data['tipoEvento']) +
"' en data.tipoEvento no válido. Valores: " +
constanteService.tiposEventos.map((a) => a.codigo + '-' + a.descripcion + ' ')
);
}
data['tipoEventoDescripcion'] = constanteService.tiposEventos.filter((td) => td.codigo == data['tipoEvento'])[0][
'descripcion'
];*/
}
/**
* Si los valores vienen en underscore, crea los valores en formato variableJava que
* sera utilizado dentro del proceso,
*
* Ej. si viene tipo_documento crea una variable tipoDocumento, con el mismo valor.
*
* @param data
*/
addUnderscore(data) {
if (data.tipo_documento) {
data.tipoDocumento = data.tipo_documento;
}
if (data.tipo_evento) {
data.tipoEvento = data.tipo_evento;
}
}
eventosEmisorCancelacion(params, data) {
if (!data['cdc']) {
throw new Error('Debe proporcionar el CDC en data.cdc');
}
if (!(data['cdc'].length == 44)) {
throw new Error('El CDC en data.cdc debe tener 44 caracteres');
}
if (!data['motivo']) {
throw new Error('Debe proporcionar el Motivo de la Cancelación en data.motivo');
}
if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) {
throw new Error('El Motivo de la Cancelación en data.motivo debe contener de [5-500] caracteres');
}
const jsonResult = {};
jsonResult['rGeVeCan'] = {
Id: data['cdc'],
mOtEve: data['motivo'],
};
return jsonResult;
}
eventosEmisorInutilizacion(params, data) {
if (!data['timbrado']) {
throw new Error('Falta el Timbrado en data.timbrado');
}
if (!data['establecimiento']) {
throw new Error('Falta el Establecimiento en data.establecimiento');
}
if (new String(data['establecimiento']).length != 3) {
throw new Error('El establecimiento debe tener una longitud de 3 caracteres');
}
if (!data['punto']) {
throw new Error('Falta el Punto en data.punto');
}
if (new String(data['punto']).length != 3) {
throw new Error('El punto debe tener una longitud de 3 caracteres');
}
if (!data['desde']) {
throw new Error('Falta el valor inicial Desde en data.desde');
}
if (!data['hasta']) {
throw new Error('Falta el valor final hasta en data.hasta');
}
if (+data['desde'] > +data['hasta']) {
throw new Error('El valor inicial en data.desde debe ser inferior o igual al valor final en data.hasta');
}
if (!data['tipoDocumento']) {
throw new Error('Falta el Tipo de Documento en data.tipoDocumento');
}
if (new String(data['timbrado']).length != 8) {
throw new Error('El timbrado debe tener una longitud de 8 caracteres');
}
if (!data['motivo']) {
throw new Error('Falta el Motivo de la Cancelación en data.motivo');
}
if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) {
throw new Error('El Motivo de la Inutilización en data.motivo debe contener de [5-500] caracteres');
}
const jsonResult = {};
jsonResult['rGeVeInu'] = {
dNumTim: StringUtil_service_1.default.leftZero(data['timbrado'], 8),
dEst: StringUtil_service_1.default.leftZero(data['establecimiento'], 3),
dPunExp: StringUtil_service_1.default.leftZero(data['punto'], 3),
dNumIn: StringUtil_service_1.default.leftZero(data['desde'], 7),
dNumFin: StringUtil_service_1.default.leftZero(data['hasta'], 7),
iTiDE: data['tipoDocumento'],
mOtEve: data['motivo'],
};
return jsonResult;
}
//---
//---
//---
eventosReceptorConformidad(params, data) {
const jsonResult = {};
if (Constante_service_1.default.eventoConformidadTipo.filter((um) => um.codigo === data['tipoConformidad']).length == 0) {
throw new Error("Tipo de Conformidad '" +
data['tipoConformidad'] +
"' en data.tipoConformidad no encontrado. Valores: " +
Constante_service_1.default.eventoConformidadTipo.map((a) => a.codigo + '-' + a.descripcion));
}
if (!data['cdc']) {
throw new Error('Debe proporcionar el CDC en data.cdc');
}
if (new String(data['cdc']).length != 44) {
throw new Error('El CDC en data.cdc debe tener una longitud de 44 caracteres');
}
jsonResult['rGeVeConf'] = {
/*$: {
,
},*/
Id: data['cdc'],
iTipConf: data['tipoConformidad'],
};
if (data['tipoConformidad'] == 2) {
if (!data['fechaRecepcion']) {
throw new Error('Obligatorio proporcionar Fecha estimada de recepción en data.fechaRecepcion');
}
if (new String(data['fechaRecepcion']).length != 19) {
throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion');
}
jsonResult['rGeVeConf']['dFecRecep'] = data['fechaRecepcion'];
}
return jsonResult;
}
eventosReceptorDisconformidad(params, data) {
const jsonResult = {};
if (!data['cdc']) {
throw new Error('Debe proporcionar el CDC en data.cdc');
}
if (!(data['cdc'].length == 44)) {
throw new Error('El CDC en data.cdc debe tener 44 caracteres');
}
if (!data['motivo']) {
throw new Error('Debe proporcionar el Motivo de la Disconformidad en data.motivo');
}
if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) {
throw new Error('El Motivo de la Disconformidad en data.motivo debe contener de [5-500] caracteres');
}
jsonResult['rGeVeDisconf'] = {
Id: data['cdc'],
mOtEve: data['motivo'],
};
return jsonResult;
}
eventosReceptorDesconocimiento(params, data) {
const jsonResult = {};
if (!data['cdc']) {
throw new Error('Debe proporcionar el CDC en data.cdc');
}
if (!(data['cdc'].length == 44)) {
throw new Error('El CDC en data.cdc debe tener 44 caracteres');
}
if (!data['motivo']) {
throw new Error('Debe proporcionar el Motivo del Desconocimiento en data.motivo');
}
if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) {
throw new Error('El Motivo del Desconocimiento en data.motivo debe contener de [5-500] caracteres');
}
if (Constante_service_1.default.tipoReceptor.filter((um) => um.codigo === +data['tipoReceptor']).length == 0) {
throw new Error("Tipo de Receptor '" +
data['tipoReceptor'] +
"' en data.tipoReceptor no encontrado. Valores: " +
Constante_service_1.default.tipoReceptor.map((a) => a.codigo + '-' + a.descripcion));
}
if (!data['nombre']) {
throw new Error('Debe especificar el Nombre/Razón Social del receptor en data.nombre');
}
if (!(data['nombre'].length >= 4)) {
throw new Error('El Nombre del Cliente en data.nombre debe tener una longitud mínima de 4 caracteres');
}
if (new String(data['fechaRecepcion']).length != 19) {
throw new Error('La fecha de emisión debe tener una longitud de 19 caracteres en data.fechaRecepcion');
}
if (new String(data['fechaRecepcion']).length != 19) {
throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion');
}
jsonResult['rGeVeDescon'] = {
Id: data['cdc'],
dFecEmi: data['fechaEmision'],
dFecRecep: data['fechaRecepcion'],
iTipRec: +data['tipoReceptor'],
dNomRec: data['nombre'],
};
if (+data['tipoReceptor'] == 1) {
if (data['ruc'].indexOf('-') == -1) {
throw new Error('RUC del Receptor debe contener dígito verificador en data.ruc');
}
const rucEmisor = data['ruc'].split('-')[0];
const dvEmisor = data['ruc'].split('-')[1];
jsonResult['rGeVeDescon']['dRucRec'] = rucEmisor;
jsonResult['rGeVeDescon']['dDVRec'] = dvEmisor;
}
if (+data['tipoReceptor'] == 2) {
if (Constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['documentoTipo']).length == 0) {
throw new Error("Tipo de Documento '" +
data['documentoTipo'] +
"' en data.documentoTipo no encontrado. Valores: " +
Constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion));
}
jsonResult['rGeVeDescon']['dTipIDRec'] = data['documentoTipo'];
if (!data['documentoNumero']) {
throw new Error('Debe especificar el Número de Documento del receptor en data.documentoNumero');
}
jsonResult['rGeVeDescon']['dNumID'] = data['documentoNumero'];
}
jsonResult['rGeVeDescon']['mOtEve'] = data['motivo'];
return jsonResult;
}
eventosReceptorNotificacionRecepcion(params, data) {
const jsonResult = {};
if (!data['cdc']) {
throw new Error('Debe proporcionar el CDC en data.cdc');
}
if (!(data['cdc'].length == 44)) {
throw new Error('El CDC en data.cdc debe tener 44 caracteres');
}
if (Constante_service_1.default.tipoReceptor.filter((um) => um.codigo === +data['tipoReceptor']).length == 0) {
throw new Error("Tipo de Receptor '" +
data['tipoReceptor'] +
"' en data.tipoReceptor no encontrado. Valores: " +
Constante_service_1.default.tipoReceptor.map((a) => a.codigo + '-' + a.descripcion));
}
if (!data['nombre']) {
throw new Error('Debe especificar el Nombre/Razón Social del receptor en data.nombre');
}
if (!(data['nombre'].length >= 4)) {
throw new Error('El Nombre del Cliente en data.nombre debe tener una longitud mínima de 4 caracteres');
}
if (new String(data['fechaRecepcion']).length != 19) {
throw new Error('La fecha de emisión debe tener una longitud de 19 caracteres en data.fechaRecepcion');
}
if (new String(data['fechaRecepcion']).length != 19) {
throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion');
}
jsonResult['rGeVeNotRec'] = {
Id: data['cdc'],
dFecEmi: data['fechaEmision'],
dFecRecep: data['fechaRecepcion'],
iTipRec: +data['tipoReceptor'],
dNomRec: data['nombre'],
};
if (+data['tipoReceptor'] == 1) {
if (data['ruc'].indexOf('-') == -1) {
throw new Error('RUC del Receptor debe contener dígito verificador en data.ruc');
}
const rucEmisor = data['ruc'].split('-')[0];
const dvEmisor = data['ruc'].split('-')[1];
jsonResult['rGeVeNotRec']['dRucRec'] = rucEmisor;
jsonResult['rGeVeNotRec']['dDVRec'] = dvEmisor;
}
if (+data['tipoReceptor'] == 2) {
if (Constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['documentoTipo']).length == 0) {
throw new Error("Tipo de Documento '" +
data['documentoTipo'] +
"' en data.documentoTipo no encontrado. Valores: " +
Constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion));
}
jsonResult['rGeVeNotRec']['dTipIDRec'] = data['documentoTipo'];
if (!data['documentoNumero']) {
throw new Error('Debe especificar el Número de Documento del receptor en data.documentoNumero');
}
jsonResult['rGeVeNotRec']['dNumID'] = data['documentoNumero'];
}
jsonResult['rGeVeNotRec']['dTotalGs'] = data['totalPYG'];
return jsonResult;
}
normalizeXML(xml) {
xml = xml.split('\r\n').join('');
xml = xml.split('\n').join('');
xml = xml.split('\t').join('');
xml = xml.split(' ').join('');
xml = xml.split('> <').join('><');
xml = xml.split('> <').join('><');
xml = xml.replace(/\r?\n|\r/g, '');
return xml;
}
}
exports.default = new JSonEventoMainService();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkV2ZW50b01haW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qc29uRXZlbnRvTWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw0RUFBbUQ7QUFDbkQsNEVBQW1EO0FBQ25ELDhFQUFxRDtBQUVyRCxNQUFNLHFCQUFxQjtJQUEzQjtRQUNFLG9CQUFlLEdBQVEsSUFBSSxDQUFDO1FBQzVCLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLFNBQUksR0FBUSxFQUFFLENBQUM7SUFxa0JqQixDQUFDO0lBbmtCQzs7Ozs7Ozs7T0FRRztJQUVJLDRCQUE0QixDQUFDLEVBQVUsRUFBRSxNQUFXLEVBQUUsSUFBUztRQUNwRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDbEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFPLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJO2dCQUNGLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsd0RBQXdELEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hGOzs7Ozs7Ozs7eURBU3lDO2dCQUV6QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3RCO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDhCQUE4QixDQUFDLEVBQVUsRUFB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