diff --git a/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java b/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java index 508e65a..cf6f8e3 100755 --- a/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java +++ b/src/test/java/de/mpc/pia/intermediate/IntermediateJAXBTest.java @@ -5,59 +5,33 @@ import java.io.File; import java.io.IOException; -import org.apache.log4j.Logger; -import org.junit.BeforeClass; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.junit.Test; import de.mpc.pia.intermediate.xmlhandler.PIAIntermediateJAXBHandler; -import de.mpc.pia.modeller.PIAModellerTest; public class IntermediateJAXBTest { /** logger for this class */ - private static final Logger LOGGER = Logger.getLogger(IntermediateJAXBTest.class); - - private static File piaFile; - - - @BeforeClass - public static void setUpBeforeClass() { - piaFile = new File(PIAModellerTest.class.getResource("/55merge_mascot_tandem.pia.xml").getPath()); - } - + private static final Logger LOGGER = LogManager.getLogger(); @Test - public void testIntermediateJAXB() { + public void testIntermediateJAXB() throws IOException{ PIAIntermediateJAXBHandler intermediateHandler; intermediateHandler = new PIAIntermediateJAXBHandler(); - Runtime runtime = Runtime.getRuntime(); - double mb = 1024*1024; - final long startTime = System.nanoTime(); - final long endTime; - - try { - intermediateHandler.parse(piaFile.getAbsolutePath(), null); - } catch (IOException e) { - LOGGER.error(e); - } - - endTime = System.nanoTime(); - - assertEquals(2, intermediateHandler.getFiles().size()); - assertEquals(2, intermediateHandler.getSpectraData().size()); - assertEquals(2, intermediateHandler.getSearchDatabase().size()); - assertEquals(2, intermediateHandler.getAnalysisSoftware().size()); - assertEquals(1941, intermediateHandler.getGroups().size()); - assertEquals(2131, intermediateHandler.getAccessions().size()); - assertEquals(2113, intermediateHandler.getPeptides().size()); - assertEquals(2478, intermediateHandler.getPSMs().size()); - assertEquals(1856, intermediateHandler.getNrTrees()); - - LOGGER.info("Total Memory: " + runtime.totalMemory() / mb + " MB"); - LOGGER.info("Used Memory: " + (runtime.totalMemory() - runtime.freeMemory()) / mb + " MB"); - LOGGER.info("Free Memory: " + runtime.freeMemory() / mb + " MB"); - LOGGER.info("Max Memory: " + runtime.maxMemory() / mb + " MB"); - LOGGER.info("Execution time: " + ((endTime - startTime) / 1000000000.0) + " s"); + File piaFile = new File(IntermediateJAXBTest.class.getResource("/55merge_mascot_tandem.pia.xml").getPath()); + intermediateHandler.parse(piaFile.getAbsolutePath(), null); + + assertEquals("Number of Files differ", 2, intermediateHandler.getFiles().size()); + assertEquals("Number of SpectraData differ", 2, intermediateHandler.getSpectraData().size()); + assertEquals("Number of SearchDatabases differ", 2, intermediateHandler.getSearchDatabase().size()); + assertEquals("Number of AnalysisSoftware differ", 2, intermediateHandler.getAnalysisSoftware().size()); + assertEquals("Number of Groups differ", 1941, intermediateHandler.getGroups().size()); + assertEquals("Number of Accessions differ", 2131, intermediateHandler.getAccessions().size()); + assertEquals("Number of Peptides differ", 2113, intermediateHandler.getPeptides().size()); + assertEquals("Number of PSMs differ", 2478, intermediateHandler.getPSMs().size()); + assertEquals("Number of NrTrees differ", 1856, intermediateHandler.getNrTrees()); } } diff --git a/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java index 7647dc5..3a25649 100755 --- a/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java +++ b/src/test/java/de/mpc/pia/modeller/exporter/MzIdentMLExportAndImportTest.java @@ -12,7 +12,6 @@ import org.junit.Test; import de.mpc.pia.intermediate.compiler.PIACompiler; -import de.mpc.pia.intermediate.compiler.PIACompilerTest; import de.mpc.pia.intermediate.compiler.PIASimpleCompiler; import de.mpc.pia.modeller.PIAModeller; import de.mpc.pia.modeller.protein.inference.SpectrumExtractorInference; @@ -28,6 +27,7 @@ public class MzIdentMLExportAndImportTest { private File tandemIdXMLResults; private File tandemMzidResults; + private File cometMzid12Results; private String piaIntermediateFileName; /** logger for this class */ private static final Logger LOGGER = Logger.getLogger(PIACompiler.class); @@ -36,8 +36,9 @@ public class MzIdentMLExportAndImportTest { public void setUp() { piaIntermediateFileName = "PIACompilerTest.pia.xml"; - tandemIdXMLResults = new File(PIACompilerTest.class.getResource("/merge1-tandem-fdr_filtered-015.idXML").getPath()); - tandemMzidResults = new File(PIACompilerTest.class.getResource("/55merge_tandem.mzid").getPath()); + tandemIdXMLResults = new File(MzIdentMLExportAndImportTest.class.getResource("/merge1-tandem-fdr_filtered-015.idXML").getPath()); + tandemMzidResults = new File(MzIdentMLExportAndImportTest.class.getResource("/55merge_tandem.mzid").getPath()); + cometMzid12Results = new File(MzIdentMLExportAndImportTest.class.getResource("/comet_mzid12.mzid").getPath()); } @@ -57,6 +58,22 @@ public void testMzIdentMLv1_1_0Import() throws IOException { } + @Test + public void testMzIdentMLv1_2_0Import() { + PIACompiler piaCompiler = new PIASimpleCompiler(); + + assertTrue(piaCompiler.getDataFromFile("mzid", cometMzid12Results.getAbsolutePath(), null, null)); + + piaCompiler.buildClusterList(); + piaCompiler.buildIntermediateStructure(); + + piaCompiler.setName("testFile"); + + assertEquals("Wrong number of imported peptides", 600, piaCompiler.getNrPeptides()); + assertEquals("Wrong number of imported PSMs", 610, piaCompiler.getNrPeptideSpectrumMatches()); + } + + @Test public void testMzIdentMLExportAndImport() throws IOException { PIACompiler piaCompiler = new PIASimpleCompiler(); diff --git a/src/test/resources/comet_mzid12.mzid b/src/test/resources/comet_mzid12.mzid new file mode 100644 index 0000000..46e5ef3 --- /dev/null +++ b/src/test/resources/comet_mzid12.mzid @@ -0,0 +1,12980 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AAAENSDAWTHWR + + + AAEFDFMADVVK + + + + + + AANEHCFLEVGR + + + AASSAGQTEARACR + + + ADFIMNR + + + + + + ADYLHFK + + + AEFTSLTK + + + AENDMAMKR + + + + + + AENDMAMKR + + + + + + AFCAGGDIR + + + AFDQASSR + + + AGAVTSTPNR + + + AGEEGEEEDDPFYPNR + + + AGEQANGQKK + + + AGLQMKSPEK + + + + + + AHTPVYR + + + AHWEVER + + + AIFGAGCDR + + + AIMDRMNKDNNALR + + + + + + + + + AIYGASLK + + + AKAAEDARTQAPR + + + AKDQLTCNKFDLK + + + AKTLEIEACR + + + ALPTSKPEGSLHSSPVGPSSSK + + + ALYTATEK + + + ALYTSVDK + + + AMLHDLYAYVDNGYR + + + APVPTSQSSPPRRGPQSSSAR + + + AQTMPASVSELEFER + + + ARAGSEGRGCQPVCSR + + + ARASGGERGSCVPCQR + + + ARGGQTNLEDGK + + + ARGRVVNMSSSGGR + + + ASRRMLEEER + + + + + + ATAENQALR + + + ATEGQSKPR + + + ATHVPYR + + + AWHVEER + + + AYAEELASR + + + AYDHLFK + + + AYLNGDGSGR + + + AYVHEFK + + + CCSHCGLKCMDPRR + + + + + + CDVCGKEFSQSSR + + + CECESTVDNGK + + + CESMLLDETK + + + + + + CFLIETAK + + + CSCFPGQVAGTTR + + + CSDLTLEEMK + + + + + + CSEQVQDFTK + + + CVDGCKESFSQSR + + + CYCEKACK + + + CYSNQLVSDR + + + DAASKVAVPMR + + + + + + DCGRMLTR + + + DCGSESLGMER + + + + + + DDEKDQDEK + + + DDVTDEEMER + + + + + + DDWLHNR + + + DEPINCESFK + + + DGADGIEKAVEPMVR + + + DGDVDQGFR + + + DHSDSESTSSDNSGR + + + DIKPIIK + + + DILHTQHVTQSR + + + DINTIEDAVK + + + DKDGPCLCSAGPCSDSK + + + DKIIPIK + + + DMDETEVEDR + + + + + + DMGTVTITSGNPSMSR + + + + + + + + + DMSQEDRK + + + DPAYLKDPKVCNIR + + + DPDASKPEDWDER + + + DPDEDNGGEPEK + + + DQEQVVMNLDSR + + + DQESPKMPR + + + DRDLATPWDTR + + + DSDTGWTALHEACNRGYYDVAK + + + DTLDENGVLITSR + + + DTSQGEYWR + + + DWDHLNR + + + EAAMGQGFDR + + + EACFPVNLANEER + + + EAEGAEEDGR + + + EAPGAADER + + + ECKHNDCR + + + ECKQRYSIC + + + ECRAGHK + + + EDAGGEEEAR + + + EDEDTELR + + + EDGSCFGGGGGGPDSAR + + + EEGERPPCGEGGER + + + EEGQERR + + + EEGVDMLR + + + + + + EELLPHLLPLLK + + + EEPSNDNVIK + + + EGAGVPGAAFPEPAGTR + + + EGCVDSRAEQLER + + + EGDCGFGDGGPSGASGR + + + EGGGPSTPR + + + EGPASWREGR + + + EIENKAIQDPR + + + EKAEPSDLK + + + EKAPEDSLK + + + EKEMVEK + + + EKNSTSNHQVLK + + + ELAGHTGYLSCCR + + + ELALGQDR + + + ELESEKGLTQER + + + ELGVVMYNCSCLAR + + + + + + ELKVLTLQNNQLK + + + ELNQIDELR + + + ELQDSSMDLSENR + + + EMHCGVASRWR + + + + + + EMLDKTKMAMEK + + + + + + ENLFILEEEQR + + + ENSEAEGDNR + + + ENVTMEQLR + + + EPACMWCCAPGSR + + + EPDATPMR + + + EPKAHCR + + + EQMMEAHK + + + + + + EQSIFGDHRDEEEETHMK + + + ERECKEEMHR + + + ERVWEGSGDSEPDIPK + + + ERYTQAK + + + ESAPIKEPK + + + ESKEEETSIDVAGKPNEVTK + + + ESLLDKK + + + ESMSSGVDLSMNHK + + + ESQSVEEALK + + + ESRAWAPR + + + ESVVDYCNR + + + ETNISYSQEADDR + + + ETSREGTSSFHTR + + + EVISVYDK + + + EVLHGNQR + + + EVVRYLGGSGGAGGR + + + FCKHLESTELR + + + FDAPEDSHLEK + + + FGALTAEK + + + FGNKECK + + + FNLDISK + + + FNTTAVPK + + + FQDMLNNKECK + + + + + + FQVLDSK + + + FSEGEATLR + + + FYSYGLEK + + + GADIDAVDIK + + + GAEGGSPEEAGGGRER + + + GAEGPEAER + + + GAPISVYQVIVEEER + + + GAPSAGRER + + + GASANWWNHR + + + GEAEASAGEATRAPIR + + + GELPGKGSEAGPVGK + + + GGHFSQAR + + + GGPASVPSSSPGTSVK + + + GKMWEEAISLCK + + + + + + GLGGPAPPEPDSGPQR + + + GLYDPAYVDDSWER + + + GMGASVFSSGASGR + + + + + + GNCTWGMNCR + + + GNGTAQSADLR + + + GPDEGIDGR + + + GPRAPPRPGPPDPAYR + + + GQSIRYGSRTCK + + + GRDEGCISQR + + + GSASGNALGRCCR + + + GSGPVLDLSSNPPCER + + + GSSYGVTSTESYK + + + GTAGNALMDGASQLMGENR + + + + + + GTAGNALMDGASQLMGENR + + + + + + GTAPGKTCLPR + + + GTGSAIPFLPSIEGENQKGCK + + + GTLDGGFR + + + GTVRPANDFNPDADAK + + + GVTSEEFDKFLEER + + + GWGGPSRGCQSAEEPER + + + GYMMMFPR + + + + + + + + + GYMMMFPR + + + + + + + + + GYMMMFPR + + + + + + + + + HCRTYCEGKGPGCHEHTK + + + HDFSLFK + + + HDYIFK + + + HHRRGSPEEAAER + + + HPPTNTTK + + + HQSHTAEAGPR + + + HQTQPR + + + HRNTETSKSPEK + + + HTSLESNHTGMQR + + + + + + HYDRNKDGNK + + + HYVLCYSDAEDR + + + IASSEMCGSK + + + + + + ICKANASPGK + + + IDKPILK + + + IESSDTFSFCCTNER + + + IGALQGAVDR + + + IGYSGSRSR + + + IITPFIIENILK + + + IKDEDEAKDPSWPDR + + + IKDIPLK + + + IKDPDASKPEDWDER + + + ILGGVPAPERK + + + ILHGEVNKVK + + + ILKHLQEQK + + + ILQEGVDPK + + + ILQQDAGAGEK + + + INLLAGDAAK + + + IPCNSDNALSR + + + IQDPTEDAEAEDTPR + + + ISDLDLLR + + + ISEEDELDTK + + + ISEPMEAHNEGSNLER + + + ISNGQPFDTLRSLPR + + + ISQSAEYR + + + ITDMHFCVR + + + ITTTFPAVHALMTDFMLR + + + + + + + + + IVELVEQR + + + IVGDLGAAQR + + + IVITDFGK + + + IVSNNCTDGLR + + + KAKGGLSER + + + KAMMQQK + + + + + + + + + KAPETAER + + + KAQFKGELFPFK + + + KAQQMMK + + + + + + + + + KDEDDVRDSAPR + + + KDMRGHR + + + KDWEAPTSR + + + KEAGKELHNK + + + KEDQFR + + + KEFPNDQVK + + + KEGAKEHNLK + + + KGDSSAEELK + + + KGFEVEK + + + KGITLEYEAK + + + KGMLYCDDLR + + + + + + KGTEELYAIK + + + KIMGGSGTETTLEK + + + + + + KKVEAQLQELQVK + + + KLDPLLK + + + KLILMQK + + + KLLATDSLFK + + + KLLIQMK + + + KLMVALAK + + + KLVMLAAK + + + KMMNEMER + + + + + + KMMNEMER + + + + + + KMNMMEER + + + + + + KMVQEDEK + + + KMWIIFGEK + + + KPALVSTVEGGQDPK + + + KPFNFLPMQINTNK + + + KPFSQHVR + + + KPGDLSDELR + + + KPPKPQLMANYYNK + + + KPTKPESQSPGKR + + + KQMQELNMQEVR + + + KQQMLENQMEVR + + + KRPVGEQKELLNK + + + KRVDHCPIK + + + KRVHDPCIK + + + KSETDSVK + + + KTAEHTGEGRPAK + + + KTGMETR + + + KYRDCR + + + LAAAEGLEPK + + + LAIKLMTNLALGR + + + LATEQLNR + + + LCELQPEEK + + + LCKLKSNTNNMVEELER + + + + + + LCNQITSLLPTHK + + + LCRDCIPR + + + LDNWAQLEK + + + LDVNAAGIWEPK + + + LEAAQERYMDAMSDAK + + + + + + + + + LERDTRYVSSR + + + LFQLEK + + + LGADGDPSK + + + LGDPAEEKR + + + LGMEALAGTEGP + + + LGTQSTGPGR + + + LGVTYPK + + + LGVYPTK + + + LHTHARTFNIGKTPECHK + + + LITGPSEKGP + + + LKEDSPR + + + LKTEGNEQMK + + + + + + LLLDIRHEK + + + LLLQVQHASK + + + LLMSMR + + + + + + LLQKVYQNK + + + LLTTEMKMDMLK + + + + + + LMSTRFNQVTTR + + + + + + LNDEVIMNR + + + + + + LNETLCACFSTAGK + + + LNSEWPKDHDSMEAR + + + LPEIVQNLEDQPK + + + LQDMEAQAGWAAPGEAR + + + LQETLSAADR + + + LQFELK + + + LQLKVQNYK + + + LQNVEQLPPDEIK + + + LQQAQEMLK + + + + + + LRALHYGR + + + LSAGLAEAGR + + + LSGPDDDPLHK + + + LSHCQFAT + + + LSNWEPKDDAMSEHR + + + LSSEMNTSTVNSAR + + + LSTMRFQNTVTR + + + + + + LTGVDPSR + + + LTNLNVDR + + + LTNQELAR + + + LTSPETELR + + + LTTAPHGSKQQGTKE + + + LVELEQVR + + + LVGYTPK + + + LVNVDDNQEVLK + + + LVQLGQAEK + + + LWVCYARCCR + + + LYHNDNQDIR + + + MAATAAAGSR + + + MALVKLAK + + + MAMTQEHHMEPMTSMFFK + + + MCKVNCSDDR + + + + + + MEMPSERK + + + MEQSSDKSSAKEK + + + MFDSQVTEER + + + MGLVMDRMGSVER + + + + + + MKRSASGSGVGSR + + + + + + MLDQAAPVEEKACKFCMMSPR + + + + + + + + + MLDQAAPVEEKACKFCMMSPR + + + + + + + + + MLELNEEWSFEK + + + + + + MLETEIKVCR + + + + + + MLRDTMK + + + + + + + + + MMMMSLNSK + + + + + + + + + + + + MNVFNIR + + + MPDDYGAPR + + + MPFHLPFDFFKR + + + MPPYDGDAR + + + MPSAKSEQVK + + + MPSGAGADTLAK + + + MPVDWKSSHTR + + + MRESALER + + + + + + MRESQDAAGAHGWNR + + + MRHNTEKHCK + + + + + + MSDTLECLLTDAK + + + MTSDSPSPSEYCSYPK + + + + + + MVPVGASNAGAK + + + + + + MVPWDKSTSHR + + + NAQWMPR + + + + + + NCREVVNGSNGCR + + + NCTIVSPDAGGAK + + + NDGAISTPVGCAK + + + NDIYSVSR + + + NESSMLSDKSRTSMR + + + + + + NFNLENR + + + NGSSFQKK + + + NHLKHSSSLK + + + NKFCKLNHDEAR + + + NLNLADEDKSCR + + + NMAPGAVCSPGESK + + + NNFELNR + + + NNVCTRAGFMSK + + + + + + NPDGIPR + + + NPHTVAEK + + + NPMYTEHKGKYE + + + + + + NPSVSLVEER + + + NSDGQKSPACNAR + + + NSDSYVIR + + + NSGVTANGGPGSK + + + NSPIVDKQCK + + + NSQLVCVQGPW + + + NTEALLGPADPSASSR + + + NTEMCNVMMQLR + + + NTGFYGYHNHR + + + NYMQDSEDDRIENNHGNPEDNDAYSSK + + + + + + QAGIFCDR + + + QCYLQQVK + + + QEDAERR + + + QEDLRNQK + + + QEIEERAR + + + QELGWLER + + + QEMFHATVATEKEFFFVK + + + QETKSPGGAR + + + QFGQKLQDLAEHSDPEVR + + + QFYEYTR + + + QGGGELNGSGHGNGGGYSQK + + + QGTFHSQQALEYGTK + + + QGVDGEPR + + + QGVDIEAAR + + + QHLENDPGSNEDTDIPK + + + QHLFMFVQTMR + + + + + + + + + QILNLQHLR + + + QLDKTLGPESWPGR + + + QMAFSVLNTDEMER + + + + + + QMLFVSGER + + + QMSKYPSGER + + + + + + QNKPSSVIQPKRR + + + QPDEKNCQ + + + QPEGTPLNHFR + + + QPEVLIWGEDHPLR + + + QPGQPAPATGGPYAR + + + QPMKVYER + + + + + + QPNCEENK + + + QPYHQYEMPR + + + + + + QQICNQQPPCSR + + + QQLGGGDASTAECVR + + + QRGHEAEESR + + + QRGSHEAEER + + + QSDIMMR + + + QSLMEMQSR + + + + + + + + + QSMKYSPEGR + + + + + + QSPFASSSEHSSENGSLR + + + QSSEMMLQR + + + + + + + + + QSTWEKPDDLK + + + QTIGNSCKACGYR + + + QTPALRQCR + + + QVEVGGQGSMYADR + + + + + + QVPNSNPAR + + + QVREPSDK + + + QWASVPR + + + QYLKEDAGTNLPVVR + + + QYVYNVAK + + + RAPLGLLR + + + RASGVTHMGSELR + + + + + + RCAHGCNLSGR + + + RCAYRAPDMTGR + + + RCTPPSCPPPSSSEPR + + + REDPQACIEEQLCYSCR + + + REPEQEQGPEPELR + + + REQEAREQAIR + + + RESYARER + + + RFKCCR + + + RGFNTSLMGSSKECR + + + + + + RGLPALLR + + + RGPLLALR + + + RGTRPSHPSLMK + + + + + + RITTAVER + + + RKEEEDQR + + + RLQGPRICNWPK + + + RLQIPIR + + + RMGECWKEEMR + + + + + + RMPPPER + + + + + + RNSMSVGDK + + + + + + RPGALLLR + + + RPGWLRGSPPPTEPR + + + RQPFSGHR + + + RQQDLQR + + + RSAGDVAPPK + + + RSGGGPGSGEAGTGAPCGR + + + RTYCQGRGPECHATSK + + + RVVMLTMEER + + + + + + + + + RYHSMFDDFHR + + + + + + SAACAYVTGLVMCIR + + + + + + SAEEEAADLPTKPTK + + + SAFGFDDGNFPGLGER + + + SCKTDTSR + + + SDYGATSTCRSSYTLWDCPTDTAGNDDR + + + SEECQWDYGK + + + SEIVGSIK + + + SELGVLSK + + + SEPAFQSGSESRGR + + + SEQPTLVTASK + + + SEQSLLIENK + + + SESIQSEVCDGPLK + + + SFGSTCQLSEK + + + SFPTSSSATTESR + + + SFSMVNAQMNEER + + + + + + SFYSSHYARER + + + SGFQGEWDR + + + SGHGCISCK + + + SGISTAMEKHK + + + SGTCSGASGFR + + + SHLVHGSSPGVMGTSVATSASK + + + SIEGVSIK + + + SIMTSAEGKHK + + + SIPELCCWCPCT + + + SKNNCQNQPPSK + + + SLDFNMR + + + SLETYER + + + SLHHQSSSSEFNR + + + SLNFSSATEPMMFQR + + + SLPTHLFRQYSCLRSQR + + + SLQDNEERDEAHK + + + SLSPEQDIK + + + SLVTDAMPEDIR + + + SNDCETFWDK + + + SPDELPSAGGDGGK + + + SPQDVKMCKFCR + + + + + + SPVSTGADTTTR + + + SRVLPSTLMAPPLR + + + SSLMELAMKNCR + + + + + + SSQSSSQQFSGIGR + + + SSSQGISQFGQSSR + + + SSTSSLATDKATSR + + + SSVCSSLNSVNSSDSR + + + STGAEPGLAR + + + SVTEQGAELSNEER + + + SWTYELFTNK + + + SYPSLTTK + + + TCKESCLSEK + + + TCKMGTNK + + + + + + TDGFGIDTCR + + + TDILDKK + + + TDTAHPAGTVSMSYIK + + + + + + TEAAAADAGPAAGAGAGEAR + + + TESVLRYPMYR + + + TGALCSR + + + TGLDNQSQDSEDESDEDSSSTSHLSMLQQ + + + THSNSQQGTSSMLEDDLQLSDSEDSDSEQ + + + THTGEKPYDCR + + + TIPHPGGPGGR + + + TLEEDKKGQHK + + + TLGQAEALDK + + + TLGTPTQPGSTPR + + + TLLDQEGAAK + + + TLQISYDALK + + + TMCGRQLAEK + + + TMTNALR + + + + + + TPEQADSSWR + + + TPKCENGCKALHTYSSSCQFR + + + TPKCGEECKTSFK + + + TPLPTRSDVLSPR + + + TPPVRSTAPASLSR + + + TPTIFDTR + + + TRDESR + + + TREDSR + + + TRLAAWAR + + + TSPQAGNPTCESR + + + TTYLQVR + + + TVEFVAER + + + TVLDDCGCCR + + + TVLPFEAMPR + + + TVMEDDLDK + + + + + + TVTISQVSDNK + + + TVTNVYTR + + + TVVDSGGYR + + + TYNIKNK + + + TYNVTDDK + + + TYTQLVR + + + VAALGLDPDK + + + VANFDPGTFSLMR + + + + + + VASGPCSDLHTGR + + + VAVTAMETAAR + + + VCAHCFGLSK + + + VCRDIPIGAGGQRESPGEAK + + + VDKCSR + + + VDSPLPSDK + + + VEHHGLGGADK + + + VGAGLSEMEQQIR + + + VGASAHDDSLEEK + + + VHAQDTSVTCESDDENSDTPPDMYEPSK + + + + + + VHVPQGGGK + + + VIGSGCNLDSAR + + + VIIYQEK + + + VKKILYEDK + + + VLADSCGNGSIR + + + VLDFASLK + + + VLLAFSDK + + + VLMAGSRDLDR + + + + + + VLPGMHHPIQMK + + + VLQEYLK + + + VLVIDITSLRQR + + + VNEVNQFAAK + + + VPHQMR + + + VPKDISALPITCETR + + + VPQHMR + + + VPVPIRTACPATR + + + VQNEGSWNSYVDYK + + + VSAGFLDK + + + VSEISSVPASDR + + + VSLPCGDDMDGGKR + + + + + + VSPDSDLPK + + + VSRSFPFVSK + + + VTGTQEPGAGRPSK + + + VTLMFPNGDSAFR + + + + + + VTNKSQIR + + + VTQEAGEFMITFPYGYHAGFNH + + + + + + VVGFELDTPDR + + + VVTKPGHIINPIK + + + VYVGNLGNNGNK + + + WAGHQAAGR + + + WAVGRDGPQAPR + + + WGGCSADVR + + + WLFWRPAAECGLRQQDR + + + WLSGQMSRMQTSEMR + + + + + + + + + WLSGQMSRMQTSEMR + + + + + + + + + WPGPPVAPDQLEEVFSQHR + + + WQASKGGIRMGAR + + + + + + YAAAPDR + + + YALTGDER + + + YCKLDQCTR + + + YELISETGGSHDK + + + YELYNKCCRK + + + YFYPEPGAQDADERR + + + YICENQDSISSK + + + YIQVATK + + + YKNEKELQEVIQQQNEK + + + YLCMATNAAGTDR + + + YQALLSK + + + YQIAVTK + + + YQLAVTK + + + YTIHSQLEHLQSK + + + YYHRGAFFMDEDEEVYK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ((?<=[KR]) (?!P)) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +