Security News
New Python Packaging Proposal Aims to Solve Phantom Dependency Problem with SBOMs
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
edi-parser-cg-lib
Advanced tools
Library for edi convert, edi to json, json to edi and custom map to json, this library can be used in each component of OIH
The purpose of this library is to analyze, generate and map ASC X12 EID files, the library used is node-x12, it is important mention that this library is only for Nodejs.
The library can be installed from npm page with some of the following commands:
npm install edi-parser-cg-lib
, npm i edi-parser-cg-lib
or yarn install edi-parser-cg-lib
The following methods are available in the library:
processEdiToJSON: This method will convert the content of an EDI file to a JSON format
The JSON output format will come out with the JSEDINotation format, for more information about this output the next URL can be reviewed here.
Before returning the response, the method will validate that the output JSON is a correct JSON, if it is correct the flow will continue the method will return the result otherwise the method will send an exception and the flow will stop.
processJSToEDI: This method transforms a JSON object into JSEDINotation format and from this information creates valid content for an ".edi" file.
Before executing the conversion, the method checks that the content property contains a valid JSON (remember that the content property can come in any valid encoding, already described above), if content does not have a valid JSON object, it will throw an exception and the flow will stop. stop, otherwise the process will continue.
processMapToJSON: This method expects to receive a JSON object and the output of this method will be the same object received.
Before executing the conversion, the method checks that the mapping property contains a valid JSON, if mapping does not have a valid JSON object, it will throw an exception and the flow will stop. stop, otherwise the process will continue.
Before returning the response, the method will validate that the output JSON is a correct JSON, if it is correct the flow will continue the method will return the result otherwise the method will send an exception and the flow will stop.
All three methods are asynchronous, then use
async/await
These are the following objects and properties available in the library
content
property, this object is used all methods.functionalGroups
and header
properties, this object is used in the processJSToEDI
methodcontent
and mapping
properties, this object is used in the processMapToJSON
methodsegmentTerminator
, subElementDelimiter
elementDelimiter
and endOfLine
, this object contains optional properties that may or may not be sent, it is used in the processEdiToJSON
and processJSToEDI
methods `{
content: null
}
The content property should have the information of the EDI file, it can come with some of the following encoding:
ascii, base64, base64url, binary, latin1, utf-8, utf8
.
This property is required and is used in the all transformations
{
"elementDelimiter": "*",
"endOfLine": "\n",
"format": true,
"segmentTerminator": "~",
"subElementDelimiter": ">"
}
These are optional properties used in the processEdiToJSON
and processJSToEDI
methods.
elementDelimiter
property indicates the symbol that separates or will separate the values of each element in the EDI document, by default the value is *
.endOfLine
property indicates the symbol to separate each segment, by default it is a line break \n
.format
property indicates if the EDI content is formatted or not, by default is true
.segmentTerminator
property indicates the symbol to delimit each segment, by default it is the ~
symbol.subElementDelimiter
property indicates the symbol to delimit sub-elements, by default it is the >
symbol.For the three methods the data should be obtained by the following way.
Arguments:
data
to be processed (the EDI file or JSON file according with the type of transformation required).Description: This method will convert the content of an EDI file to a JSON output, remember that the JSON output format is a custom format called JavaScript EDI Notation, for more information about this format click here
Object and Properties: To use this method, the use of the object called objectEdiToJson
is mandatory and, if required, the optProps
object to send and replace the default values.
Example
In this first example is configured the information using the objectEdiToJson
and optProps
objects.
If the EDI file is not formatted, the property
format
must be set in false.
let properties = {
...objectEdiToJson
};
properties.content = fs.readFileSync(path.join(__dirname, 'Sample_850_01.edi'), {
encoding: 'binary'
});
let optsP = {
...optProps
};
optsP.elementDelimiter = '/';
properties = {
...properties,
...optsP
};
const _data = await processJSToEDI({
data: properties
}, {}, true);
console.log(_data);
In this second example it is set the information without using the objects described above, that only uses the properties:
let properties = {
elementDelimiter: '/',
endOfLine: '\n',
};
properties.content = fs.readFileSync(tempFilePath, {
encoding: 'base64'
});
const _data = await processEdiToJSON({
data: properties
}, {}, true);
console.log(_data)
Result: In both examples (the first and second) the result will be the same:
{
"header":[
"01",
"0000000000",
"01",
"0000000000",
"ZZ",
"ABCDEFGHIJKLMNO",
"ZZ",
"123456789012345",
"101127",
"1719",
"U",
"00400",
"3438",
"0",
"P",
">"
],
"options":{
"elementDelimiter":"/",
"endOfLine":"\n",
"format":false,
"segmentTerminator":"~",
"subElementDelimiter":">",
"repetitionDelimiter":"^",
"segmentHeaders":[
{
"tag":"GS",
"trailer":"GE",
"layout":{
"GS01":2,
"GS02":15,
"GS02_MIN":2,
"GS03":15,
"GS03_MIN":2,
"GS04":8,
"GS05":8,
"GS05_MIN":4,
"GS06":9,
"GS06_MIN":1,
"GS07":2,
"GS07_MIN":1,
"GS08":12,
"GS08_MIN":1,
"COUNT":8,
"PADDING":false
}
},
{
"tag":"ISA",
"trailer":"IEA",
"layout":{
"ISA01":2,
"ISA02":10,
"ISA03":2,
"ISA04":10,
"ISA05":2,
"ISA06":15,
"ISA07":2,
"ISA08":15,
"ISA09":6,
"ISA10":4,
"ISA11":1,
"ISA12":5,
"ISA13":9,
"ISA14":1,
"ISA15":1,
"ISA16":1,
"COUNT":16,
"PADDING":true
}
},
{
"tag":"ST",
"trailer":"SE",
"layout":{
"ST01":3,
"ST02":9,
"ST02_MIN":4,
"ST03":35,
"ST03_MIN":1,
"COUNT":3,
"COUNT_MIN":2,
"PADDING":false
}
}
],
"txEngine":"internal"
},
"functionalGroups":[
{
"header":[
"PO",
"4405197800",
"999999999",
"20101127",
"1719",
"1421",
"X",
"004010VICS"
],
"transactions":[
{
"header":[
"810",
"0001"
],
"segments":[
{
"tag":"BIG",
"elements":[
"20000513",
"SG427254",
"20000506",
"508517",
"1001"
]
},
{
"tag":"N1",
"elements":[
"ST",
"ABC AEROSPACE CORPORATION",
"9",
"123456789-0101"
]
},
{
"tag":"N3",
"elements":[
"1000 BOARDWALK DRIVE"
]
},
{
"tag":"N4",
"elements":[
"SOMEWHERE",
"CA",
"98898"
]
},
{
"tag":"ITD",
"elements":[
"05",
"3",
"",
"",
"",
"",
"30",
"",
"",
"",
"",
"",
"",
"E"
]
},
{
"tag":"IT1",
"elements":[
"1",
"48",
"EA",
"1",
"",
"MG",
"R5656-2"
]
},
{
"tag":"TDS",
"elements":[
"14400"
]
},
{
"tag":"CTT",
"elements":[
"1"
]
}
]
}
]
}
]
}
Description: This method will convert a formatted JSON in JSEDINotation to the content of an EDI file.
Object and Properties: To use this method, the object called objectJsonToEdi
must be used.
Remember that this JSON must go in the content property
Notes:
optProps
object.repetitionDelimiter
, segmentHeaders
and txEngine
properties, but these are not mandatory.functionalGroups
property of the objectJsonToEdi
object uses contains required properties, so it is recommended to read the documentation for the JSEDINotation.Example
If the EDI file output is not required to have format, the
format
property should be in false.
The value of input
will be:
{
"header": [
"01",
"0000000000",
"01",
"0000000000",
"ZZ",
"ABCDEFGHIJKLMNO",
"ZZ",
"123456789012345",
"101127",
"1719",
"U",
"00400",
"3438",
"0",
"P",
">"
],
"options": {
"elementDelimiter": "/",
"endOfLine": "\n"
},
"functionalGroups": [
{
"header": [
"PO",
"4405197800",
"999999999",
"20101127",
"1719",
"1421",
"X",
"004010VICS"
],
"transactions": [
{
"header": [
"277",
"0003",
"005010X364"
],
"segments": [
{
"tag": "BHT",
"elements": [
"0085",
"08",
"0000221",
"20190221",
"1025"
]
},
{
"tag": "HL",
"elements": [
"1",
"",
"20",
"1"
]
},
{
"tag": "NM1",
"elements": [
"ACV",
"2",
"ALL PAYER CLAIMS DATABASE",
"",
"",
"",
"",
"46",
"APCD01"
]
},
{
"tag": "TRN",
"elements": [
"1",
"ABC12345"
]
},
{
"tag": "DTP",
"elements": [
"050",
"D8",
"20190220"
]
},
{
"tag": "DTP",
"elements": [
"009",
"D8",
"20190221"
]
},
{
"tag": "HL",
"elements": [
"2",
"1",
"21",
"1"
]
},
{
"tag": "NM1",
"elements": [
"40",
"2",
"YOUR INSURANCE COMPANY",
"",
"",
"",
"",
"46",
"S00003"
]
},
{
"tag": "TRN",
"elements": [
"2",
"206438976580901"
]
},
{
"tag": "STC",
"elements": [
"DR02:20",
"20190221",
"WQ",
"365.5"
]
},
{
"tag": "QTY",
"elements": [
"90",
"3"
]
},
{
"tag": "QTY",
"elements": [
"AA",
"2"
]
},
{
"tag": "AMT",
"elements": [
"YU",
"200.5"
]
},
{
"tag": "AMT",
"elements": [
"YY",
"165"
]
},
{
"tag": "HL",
"elements": [
"3",
"2",
"19",
"1"
]
},
{
"tag": "NM1",
"elements": [
"85",
"1",
"JONES",
"HARRY",
"B",
"",
"MD",
"XX",
"1546326897"
]
},
{
"tag": "HL",
"elements": [
"4",
"3",
"PT"
]
},
{
"tag": "NM1",
"elements": [
"QC",
"1",
"PATIENT",
"FEMALE",
"",
"",
"",
"MI",
"2222222222"
]
},
{
"tag": "TRN",
"elements": [
"2",
"PATIENT22222"
]
},
{
"tag": "STC",
"elements": [
"DR02:20:PR",
"20190221",
"WQ",
"100"
]
},
{
"tag": "REF",
"elements": [
"F8",
"IC847502"
]
},
{
"tag": "REF",
"elements": [
"1K",
"220216359803X"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190214"
]
},
{
"tag": "HL",
"elements": [
"5",
"3",
"PT"
]
},
{
"tag": "NM1",
"elements": [
"QC",
"1",
"PATIENT",
"MALE",
"",
"",
"",
"MI",
"3333333333"
]
},
{
"tag": "TRN",
"elements": [
"2",
"PATIENT33333"
]
},
{
"tag": "STC",
"elements": [
"DR06:21",
"20190221",
"U",
"65",
"",
"",
"",
"",
"",
"DR06:255"
]
},
{
"tag": "REF",
"elements": [
"F8",
"IC429783"
]
},
{
"tag": "REF",
"elements": [
"1K",
"220216359954X"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190121"
]
},
{
"tag": "HL",
"elements": [
"6",
"3",
"PT"
]
},
{
"tag": "NM1",
"elements": [
"QC",
"1",
"JONES",
"LARRY",
"",
"",
"",
"MI",
"4444444444"
]
},
{
"tag": "TRN",
"elements": [
"2",
"JONES44444"
]
},
{
"tag": "STC",
"elements": [
"DR03:26:77",
"20190221",
"U",
"100"
]
},
{
"tag": "REF",
"elements": [
"F8",
"IC429805"
]
},
{
"tag": "REF",
"elements": [
"1K",
"220216359964X"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190211"
]
},
{
"tag": "HL",
"elements": [
"7",
"2",
"19",
"1"
]
},
{
"tag": "NM1",
"elements": [
"85",
"1",
"SMITH",
"JOHN",
"C",
"",
"MD",
"XX",
"1546326780"
]
},
{
"tag": "TRN",
"elements": [
"1",
"0"
]
},
{
"tag": "REF",
"elements": [
"LU",
"AB142"
]
},
{
"tag": "QTY",
"elements": [
"QA",
"2"
]
},
{
"tag": "AMT",
"elements": [
"YU",
"100.5"
]
},
{
"tag": "HL",
"elements": [
"8",
"7",
"PT"
]
},
{
"tag": "NM1",
"elements": [
"QC",
"1",
"JOHNSON",
"MARY",
"",
"",
"",
"MI",
"5555555555"
]
},
{
"tag": "TRN",
"elements": [
"2",
"JOHNSON55555"
]
},
{
"tag": "STC",
"elements": [
"DR08:20:PR",
"20190221",
"EZ",
"50.5"
]
},
{
"tag": "REF",
"elements": [
"F8",
"IC429888"
]
},
{
"tag": "REF",
"elements": [
"1K",
"220216359806X"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190210"
]
},
{
"tag": "SVC",
"elements": [
"HC:G9938",
"50.5",
"",
"",
"",
"",
"1"
]
},
{
"tag": "STC",
"elements": [
"DR08:475",
"",
"EZ"
]
},
{
"tag": "REF",
"elements": [
"6R",
"1"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190210"
]
},
{
"tag": "HL",
"elements": [
"9",
"7",
"PT"
]
},
{
"tag": "NM1",
"elements": [
"QC",
"1",
"MILLS",
"HARRIETT",
"",
"",
"",
"MI",
"6666666666"
]
},
{
"tag": "TRN",
"elements": [
"2",
"MILLS66666"
]
},
{
"tag": "STC",
"elements": [
"DR02:20:PR",
"20190221",
"WQ",
"50"
]
},
{
"tag": "REF",
"elements": [
"F8",
"IC429956"
]
},
{
"tag": "REF",
"elements": [
"1K",
"220216359807X"
]
},
{
"tag": "DTP",
"elements": [
"472",
"D8",
"20190205"
]
}
]
}
]
}
]
}
This example uses the object objectJsonToEdi
let properties = {
...objectJsonToEdi
};
properties.header = data.header;
properties.functionalGroups = data.functionalGroups;
const _data = await processJSToEDI({
data: properties
}, data);
console.log(_data);
In this second example the information is configured without the object described above, the properties used are:
let properties = {
options:{
elementDelimiter: '/',
endOfLine: '\n'
};
properties.headers = data.headers;
properties.functionalGroups = data.functionalGroups;
};
const _data = await processEdiToJSON({
data: properties
}, {}, true);
console.log(_data)
Result:
ISA/01/0000000000/01/0000000000/ZZ/ABCDEFGHIJKLMNO/ZZ/123456789012345/101127/1719/U/00400/000003438/0/P/>~
GS/PO/4405197800/999999999/20101127/1719/1421/X/004010VICS~
ST/277/0003/005010X364~
BHT/0085/08/0000221/20190221/1025~
HL/1//20/1~
NM1/ACV/2/ALL PAYER CLAIMS DATABASE/////46/APCD01~
TRN/1/ABC12345~
DTP/050/D8/20190220~
DTP/009/D8/20190221~
HL/2/1/21/1~
NM1/40/2/YOUR INSURANCE COMPANY/////46/S00003~
TRN/2/206438976580901~
STC/DR02:20/20190221/WQ/365.5~
QTY/90/3~
QTY/AA/2~
AMT/YU/200.5~
AMT/YY/165~
HL/3/2/19/1~
NM1/85/1/JONES/HARRY/B//MD/XX/1546326897~
HL/4/3/PT~
NM1/QC/1/PATIENT/FEMALE////MI/2222222222~
TRN/2/PATIENT22222~
STC/DR02:20:PR/20190221/WQ/100~
REF/F8/IC847502~
REF/1K/220216359803X~
DTP/472/D8/20190214~
HL/5/3/PT~
NM1/QC/1/PATIENT/MALE////MI/3333333333~
TRN/2/PATIENT33333~
STC/DR06:21/20190221/U/65//////DR06:255~
REF/F8/IC429783~
REF/1K/220216359954X~
DTP/472/D8/20190121~
HL/6/3/PT~
NM1/QC/1/JONES/LARRY////MI/4444444444~
TRN/2/JONES44444~
STC/DR03:26:77/20190221/U/100~
REF/F8/IC429805~
REF/1K/220216359964X~
DTP/472/D8/20190211~
HL/7/2/19/1~
NM1/85/1/SMITH/JOHN/C//MD/XX/1546326780~
TRN/1/0~
REF/LU/AB142~
QTY/QA/2~
AMT/YU/100.5~
HL/8/7/PT~
NM1/QC/1/JOHNSON/MARY////MI/5555555555~
TRN/2/JOHNSON55555~
STC/DR08:20:PR/20190221/EZ/50.5~
REF/F8/IC429888~
REF/1K/220216359806X~
DTP/472/D8/20190210~
SVC/HC:G9938/50.5/////1~
STC/DR08:475//EZ~
REF/6R/1~
DTP/472/D8/20190210~
HL/9/7/PT~
NM1/QC/1/MILLS/HARRIETT////MI/6666666666~
TRN/2/MILLS66666~
STC/DR02:20:PR/20190221/WQ/50~
REF/F8/IC429956~
REF/1K/220216359807X~
DTP/472/D8/20190205~
SE/63/0003~
GE/1/1421~
IEA/1/000003438~
Note: In this example
/
is used to indicate the separator of each element, however this symbol is replacing the default delimiter character*
.
Description: This method will receive a JSON object as input, where the value of each property should be in a format of QUERY LANGUAGE, these QUERY LANGUAGE values will be used to take the information from the content of the EDI file, therefore the result of this method will be the same input JSON mapping but each property will have the value according to its QUERY defined.
Object and Properties: To use this method, we must use the object called objectMapToJson
, in the mapping
property the JSON should be placed and in the content
property should be the EDI file to process.
Example
This is an input sample of the JSON object:
{
"PONumber": "BEG03",
"PODate": "BEG05",
"POType": "BEG02",
"ISAControlNum": "ISA13",
"GSControlNum": "FOREACH(GS)=>GS06",
"BuyerName": "PER:PER02",
"BuyerTelephone": "PER:PER04",
"BuyerEmail": "PER:PER06",
"ShipTo": "N102['ST']",
"Warehouse": "N104['ST']",
"Total": "AMT02",
"TotalPP": "CTT01",
"LineItem": {
"Quantity": "FOREACH(PO1)=>PO102",
"Price": "FOREACH(PO1)=>PO104",
"PriceBasis": "FOREACH(PO1)=>PO105",
"ProductCode": "FOREACH(PO1)=>PO107",
"ProductDescr": "FOREACH(PID)=>PID05",
"RequiredDate": "DTM02"
}
}
This is the content of the EDI file
ISA*01*0000000000*01*0000000000*ZZ*ABCDEFGHIJKLMNO*ZZ*123456789012345*101127*1719*U*00400*000003438*0*P*>~
GS*PO*4405197800*999999999*20101127*1719*1421*X*004010~
ST*850*000000010~
BEG*00*SA*08292233294**20101127*610385385~
REF*DP*038~
REF*PS*R~
PER*AM*NAME EXAMPLE*CP*1-212-324-4152*EM*mail@mail.com~
ITD*14*3*2**45**46~
DTM*002*20101214~
PKG*F*68***PALLETIZE SHIPMENT~
PKG*F*66***REGULAR~
TD5*A*92*P3**SEE XYZ RETAIL ROUTING GUIDE~
N1*ST*XYZ RETAIL*9*0003947268292~
N3*31875 SOLON RD~
N4*SOLON*OH*44139~
PO1*1*120*EA*9.25*TE*CB*065322-117*PR*RO*VN*AB3542~
PID*F****SMALL WIDGET~
PO4*4*4*EA*PLT94**3*LR*15*CT~
PO1*2*220*EA*13.79*TE*CB*066850-116*PR*RO*VN*RD5322~
PID*F****MEDIUM WIDGET~
PO4*2*2*EA~
PO1*3*126*EA*10.99*TE*CB*060733-110*PR*RO*VN*XY5266~
PID*F****LARGE WIDGET~
PO4*6*1*EA*PLT94**3*LR*12*CT~
PO1*4*76*EA*4.35*TE*CB*065308-116*PR*RO*VN*VX2332~
PID*F****NANO WIDGET~
PO4*4*4*EA*PLT94**6*LR*19*CT~
PO1*5*72*EA*7.5*TE*CB*065374-118*PR*RO*VN*RV0524~
PID*F****BLUE WIDGET~
PO4*4*4*EA~
PO1*6*696*EA*9.55*TE*CB*067504-118*PR*RO*VN*DX1875~
PID*F****ORANGE WIDGET~
PO4*6*6*EA*PLT94**3*LR*10*CT~
CTT*6~
AMT*1*13045.94~
SE*33*000000010~
GE*1*1421~
IEA*1*000003438~
The next is an example of the objectMapToJson
object used in the mapping
property where the JSON is placed and in the content file should be the content of the EDI file to be processed.
let properties = {
...objectMapToJson
};
properties.mapping = data;
properties.content = fs.readFileSync(path.join(__dirname, 'Sample_850_01.edi'), {
encoding: 'binary'
});
const _data = await processMapToJSON({
data: properties
}, {}, true);
console.log(_data);
In this second example is set the information without using the object described above, only using the properties as follows:
let properties = {
mapping: data,
content: fs.readFileSync(path.join(__dirname, 'Sample_850_01.edi'), {
encoding: 'base64'
}),
};
const _data = await processMapToJSON({
data: properties
}, {}, true);
console.log(_data)
Result:
{
"PONumber": "08292233294",
"PODate": "20101127",
"POType": "SA",
"ISAControlNum": "000000000",
"GSControlNum": [
"1421"
],
"BuyerName": "NAME EXAMPLE",
"BuyerTelephone": "1-212-324-4152",
"BuyerEmail": "mail@mail.com",
"ShipTo": "XYZ RETAIL",
"Warehouse": "0003947268292",
"Total": "13045.94",
"TotalPP": "6",
"LineItem": [
{
"Quantity": "120",
"Price": "9.25",
"PriceBasis": "TE",
"ProductCode": "065322-117",
"ProductDescr": "SMALL WIDGET",
"RequiredDate": "20101214"
},
{
"Quantity": "220",
"Price": "13.79",
"PriceBasis": "TE",
"ProductCode": "066850-116",
"ProductDescr": "MEDIUM WIDGET",
"RequiredDate": "20101214"
},
{
"Quantity": "126",
"Price": "10.99",
"PriceBasis": "TE",
"ProductCode": "060733-110",
"ProductDescr": "LARGE WIDGET",
"RequiredDate": "20101214"
},
{
"Quantity": "76",
"Price": "4.35",
"PriceBasis": "TE",
"ProductCode": "065308-116",
"ProductDescr": "NANO WIDGET",
"RequiredDate": "20101214"
},
{
"Quantity": "72",
"Price": "7.5",
"PriceBasis": "TE",
"ProductCode": "065374-118",
"ProductDescr": "BLUE WIDGET",
"RequiredDate": "20101214"
},
{
"Quantity": "696",
"Price": "9.55",
"PriceBasis": "TE",
"ProductCode": "067504-118",
"ProductDescr": "ORANGE WIDGET",
"RequiredDate": "20101214"
}
]
}
The resultant EDI file can be validated in this page
If an error occur, the result will show one of the following messages:
Batch size exceeds the limit,
Error executing query,
Error missing property,
Error with the property
FAQs
Library for edi convert, edi to json, json to edi and custom map to json, this library can be used in each component of OIH
The npm package edi-parser-cg-lib receives a total of 31 weekly downloads. As such, edi-parser-cg-lib popularity was classified as not popular.
We found that edi-parser-cg-lib demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Security News
Socket CEO Feross Aboukhadijeh discusses open source security challenges, including zero-day attacks and supply chain risks, on the Cyber Security Council podcast.
Security News
Research
Socket researchers uncover how threat actors weaponize Out-of-Band Application Security Testing (OAST) techniques across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.