Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bio"Pack"athon2021 #10 Introduction to the PyPI registration process for Python packages

くろたんく
October 13, 2021

Bio"Pack"athon2021 #10 Introduction to the PyPI registration process for Python packages

Bio"Pack"athon2021 #10 発表資料。

PythonパッケージのPyPI登録手順の紹介 ~QEPPIの開発からPyPI登録まで~

Blog:
https://blacktanktop.hatenablog.com/entry/2021/10/13/180823

GitHub :
https://github.com/ohuelab/QEPPI

Reference :
Kosugi T, Ohue M. Quantitative Estimate Index for Early-Stage Screening of Compounds Targeting Protein-Protein Interactions. International Journal of Molecular Sciences. 2021; 22(20):10925. https://doi.org/10.3390/ijms222010925

T. Kosugi and M. Ohue, Quantitative Estimate of Protein-Protein Interaction Targeting Drug-likeness, 2021 IEEE Conference on Computational Intelligence in Bioinformatics and Computational Biology (CIBCB), 2021, pp. 1-8, doi: 10.1109/CIBCB49929.2021.9562931.

Kosugi T, Ohue M. Quantitative estimate of protein-protein interaction targeting drug-likeness. In Proceedings of The 18th IEEE International Conference on Computational Intelligence in Bioinformatics and Computational Biology (CIBCB 2021). ChemRxiv, Preprint. 2021. doi:10.33774/chemrxiv-2021-psqq4-v2
https://doi.org/10.33774/chemrxiv-2021-psqq4-v2

くろたんく

October 13, 2021
Tweet

More Decks by くろたんく

Other Decks in Research

Transcript

  1. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ ݚڀࣨ঺հ  IUUQTXXXMJDUJUFDIBDKQ େ্ݚڀֶࣨੜࣨɹύʔιφϧϒʔε΋͋Γ·͢ ౦ژ޻ۀେֶ৘ใཧ޻ֶӃ৘ใ޻ֶܥେ্ݚڀࣨ ݚڀࣄྫ w λϯύΫ࣭ؒ૬ޓ࡞༻༧ଌγεςϜ.&("%0$,ͷ։ൃ w

    ໢ཏతͳ11*༧ଌσʔλϕʔε.&("%0$,8FCͷ։ൃ w ௿෼ࢠԽ߹෺ͷༀޮɾ׆ੑɾ"%.&5༧ଌ w ʮༀΒ͠͞ʯΛදݱ͢Δ౷ܭϞσϧͷ։ൃ w ϥϯΫֶशʹΑΔ-#%%εΫϦʔχϯά๏ͷ։ൃ w ૑ༀࢸదϖϓνυͷεΫϦʔχϯάͷͨΊͷٕज़։ൃ w 546#".&ʹΑΔ(16εʔύʔίϯϐϡʔςΟϯά ٕज़ͷ։ൃ େ্ݚͰ͸όΠΦΠϯϑΥϚςΟΫε΍૑ༀ෼໺ʹ܎Δଟ͘ͷςʔϚΛѻ͍ͬͯ·͢ɻ
  2. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 2&11*ͱ͸ 11*Λඪతͱ͢ΔԽ߹෺͸ɺैདྷͷ૑ༀඪతΛλʔήοτͱ͢ΔԽ߹෺ͱ͸ಛੑ͕ҟͳΔͨΊɺɹ ैདྷͷࢦඪͰ͸11*ΛඪతʹͰ͖ͦ͏ͳ౓߹͍ΛఆྔతʹධՁ͢Δ͜ͱ͕ࠔ೉Ͱ͋Δ͜ͱ͕͜Ε·Ͱͷ ݚڀͰ஌ΒΕ͍ͯ·͢ɻ ͦ͜Ͱେ্ݚڀࣨͰ͸ɺ Խ߹෺ͷ11*ΛඪతʹͰ͖ͦ͏ͳ౓߹͍ΛఆྔతʹධՁ͢Δࢦඪ2&11*Λ։ൃ͠·ͨ͠ɻ 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPOT  2&11*ͷݚڀ֓ཁͱ։ൃͨ͠2&11*ύοέʔδΛ1Z1*ʹొ࿥ͨ͠खॱΛ঺հ͠·͢ɻ

     "EW"QQM#JPJOGPSN$IFN  r *OU+.PM4DJ   ͜ͷԽ߹෺͸11*ΛඪతʹͰ͖ͦ͏ʁ఺ຬ఺தԿ఺͘Β͍͔ͳʁ 11* ڵຯ͋ΔԽ߹෺ ,PTVHJ 50IVF . 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPOT *OU+.PM4DJ  IUUQTEPJPSHJKNT IUUQTHJUIVCDPNPIVFMBC2&11*
  3. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ ૑ༀඪతͱͯ͠ͷ11*  #JP(3*%%BUBCBTF4UBUJTUJDT $VSSFOU#VJME4UBUJTUJDT  0DUPCFS  $SFBUFEXJUI#JP3FOEFSDPN *OSFDFOUZFBST

    11*TIBWFBUUSBDUFEBUUFOUJPOBTESVHUBSHFUTBNPOHWBSJPVTUBSHFUT JOESVHEFWFMPQNFOU ैདྷͷ૑ༀඪత d  (1$3 νϟωϧ ߬ૉ సࣸҼࢠ 11*ʹΑͬͯ ݕ౼ՄೳʹͳΔ૑ༀඪత d 
  4. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 11*૑ༀͷ೉͠͞ *UJTEJGGJDVMUUPEFTJHOESVHTGPS11*TCBTFEPODPOWFOUJPOBMJOEFY TVDIBT2&%  CFDBVTFUIFJSQIZTJDPDIFNJDBMQSPQFSUJFTBSFWFSZEJGGFSFOUGSPNUIPTFPG DPOWFOUJPOBMESVHUBSHFUT  $VSS0QJO$IFN#JPM WPM

    OP QQr  *OU+.PM4DJ   OPO11*UBSHFUJOH 11*UBSHFUJOH 2021). Considering the number of known PPIs, structural information on PPIs likely re- mains insufficient. We hypothesized that information on the target proteins and their ligand compounds would be sufficient without requiring three-dimensional structures. Therefore, we used iPPI-DB [29], which was manually curated from the literature. In total, 2361 PPI-targeting compounds are registered in this database (as of 21 April 2021), which are primarily derived from PPI inhibition or stabilization experiments. The num- ber of compounds registered in DrugBank was 43, which is approximately 1.8% of the total. The quality and quantity of the data meet the requirements of the dataset for model- ing QEPPI. We built the QEPPI model using data selected after clustering for non-redundancy (see Methods for details). The histograms of the distributions of seven molecular physicochemi- cal properties, MW, ALogP, HBD, HBA, TPSA, ROTB, and AROM, are shown in Figure 1. The distribution peaks and optimized weights wi of each physicochemical property are shown in Table 3. (a) MW (b) ALogP (c) HBD (d) HBA (e) TPSA (f) ROTB (g) AROM Figure 1. Histograms of seven molecular physicochemical properties for a set of non-redundant compounds of iPPI-DB. Molecular weight (MW) (a), LogP value estimated by Ghose-Crippen method (ALogP) (b), number of hydrogen bond donors (HBD) (c), number of hydrogen bond acceptors (HBA) (d), topological molecular polar surface area (TPSA) (e), number of rotatable bonds (ROTB) (f), and number of aromatic rings (AROM) (g). The solid red lines describe the asymmetric double sigmoid (ADS) function (1) used to model the QEPPI histograms. The black dashed lines describe the ADS function used to model the quantitative estimate of drug-likeness (QED) histograms. ,PTVHJ 50IVF . 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPOT *OU+.PM4DJ  IUUQTEPJPSHJKNT *OU+.PM4DJ  'JHVSF
  5. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ .PSFMMJet alQSPQPTFEUIF l3VMFPG'PVSz 30 UPFWBMVBUF11*JOIJCJUPST 5IJTQSPQPTBMXBTCBTFEPOBTUBUJTUJDBMBOBMZTJT PG11*JOIJCJUPSTJO1*EC 30DPOTJTUFEPGUIFGPMMPXJOHGPVSDSJUFSJB 3VMFPG'PVS11*્֐ࡎͷϧʔϧϕʔεͷࢦඪ

     $VSS0QJO$IFN#JPM WPM OP QQr  w .PMFDVMBSXFJHIU w "-PH1 w 5IFOVNCFSPGIZESPHFOCPOEBDDFQUPST w 5IFOVNCFSPGSJOHT 3VMFPG'PVSDSJUFSJB 3FQSFTFOUBUJWFTFUPG11*JOIJCJUPST 5/'Ћ5/'3D  5/'3"5/'#  #DM#BL /$ 9JBQ$BTQBTF  9JBQ4NBD #* )17&&  )%.Q %*; 9%.Q *.: )%.Q 88
  6. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 11*Λඪతͱ͢ΔԽ߹෺ΛఆྔධՁ2&11*ͷ։ൃ  *OUIJTTUVEZ XFEFWFMPQFEBOJOEFYDBMMFE2&11*UPTPMWFUIFTFQSPCMFNT 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPO  11*UBSHFUJOHDPNQPVOET 5SBJOEBUBTFU f(x)

    .PEFMJOH $PNQPVOETPGJOUFSFTU 1SPCMFNT w 2&%JTNPEFMFEGPSPSBMESVHT5IFESVHMJLFOFTTSFQSFTFOUTJTPSBMESVHMJLF w 30JTVTFGVMGPSGJMUFSJOH11*JOIJCJUPST CVUJUJTOPUXFMMRVBOUJUBUJWF SVMFCBTFE 2&11*4DPSF
  7. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 5IFTFSFTVMUTTVHHFTUUIBU30 BOJOEFYPGEJTDSFUFWBMVF DPVMECFFYUFOEFEUPBO JOEFYPGDPOUJOVPVTWBMVF5IFSFTVMUTTVHHFTUFEUIBU2&11*JTBHFOFSBMFYUFOTJPOPG UIF30DPODFQU 2&11*͸3VMFPG'PVSͷ֦ு֓೦  2&% 2&%@JOW

    2&11*      Version September 30, 2021 submitted to Int. J. Mol. Sci. 9 o Table 5: Precision, Recall, and F-score values for one violation of RO4 and QEPPI sco with a threshold value of 0.5196. Precision Recall F-score RO4 0.405 0.508 0.451 QEPPI 0.379 0.735 0.501 *OU+.PM4DJ  'JHVSF *OU+.PM4DJ  'JHVSF *OU+.PM4DJ  5BCMF *OU+.PM4DJ  
  8. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ  ྟচϑΣʔζͷԽ߹෺ͱࢢൢༀ΁ͷ2&11*ͷద༻ 5IFEJTUSJCVUJPOPG2&11*XBTGPVOEUPCFTJHOJGJDBOUMZEJGGFSFOUCFUXFFOBQQSPWFE 11*UBSHFUFEESVHTBOE11*UBSHFUFEDPNQPVOETJOUIFDMJOJDBMQIBTF 34$.FE$IFN EPJ%.%" *OU+.PM4DJ  

    $MJOJDBMUSJBM "QQSPWFE OPO11* $POUSPM 1BDMJUBYFM 2&11*  .JDSPUVCVMF  .BSLFUTUBSUJO 3PNJEFQTJO 2&11*  )%"$1*,  .BSLFUTUBSUJO 5FNTJSPMJNVT 2&11*  N503  .BSLFUTUBSUJO .BSLFUFEFYBNQMFT 7FSDJSOPO 2&11*  $$3  1IBTF *EBTBOVUMJO 2&11*  Q.EN  1IBTF "QBCFUBMPOF 2&11*  #&5  1IBTF $MJOJDBMUSJBMFYBNQMFT *OU+.PM4DJ  'JHVSF
  9. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ  ྟচϑΣʔζͷԽ߹෺ͱࢢൢༀ΁ͷ2&11*ͷద༻ 3FHBSEMFTTPGUIFZFBS UIF2&11*TDPSFTPGl$MJOJDBMUSJBMzDPNQPVOETIBWFSFNBJOFEIJHI 5IJTJTDPOTJTUFOUXJUIUIFSFDFOUUSFOEPGIJHIFS2&11*TDPSFTGPS.BSLFUFEESVHT 34$.FE$IFN EPJ%.%" *OU+.PM4DJ 

     $YDWURPERSDJ &DED]LWD[HO 'LPHWK\OIXPDUDWH 'RFHWD[HO (OWURPERSDJ (ULEXOLQPHV\ODWH (YHUROLPXV /HYHWLUDFHWDP /LILWHJUDVW /XVXWURPERSDJ 0DUDYLURF 3DFOLWD[HO 3LPHFUROLPXV 3OHUL[DIRU 5RPLGHSVLQ 6HOLQH[RU 5DSDP\FLQ 7DFUROLPXV 7DIDPLGLV 7HPVLUROLPXV 7LURILEDQ 9HQHWRFOD[ 9LQEODVWLQH 9RULQRVWDW <HDURIPDUNHWLQJVWDUW 4(33,VFRUH              03/732 0LFURWXEXOH .($315) ).%3 &$&1$% ,7*$/ &&5 &;&5 +'$& &50 775WHWUDPHU ,7*% %&/%$; .BSLFUFEFYBNQMFT $0* $SDEHWDORQH $3* $67; %LULQDSDQW &DURWHJUDVWPHWK\O &&; &&; &HQLFULYLURF &*0 &3, &8'& (SRWKLORQH% ,GDVDQXWOLQ /&/ 0LODGHPHWDQ 1DYDUL[LQ 1DYLWRFOD[ 2EDWRFOD[ 3HYRQHGLVWDW 3) 35, 5HSDUL[LQ 5* 52 6$5 6HUGHPHWDQ 6LUHPDGOLQ 9HUFLUQRQ ;HYLQDSDQW <HDURIFOLQLFDOWULDO 4(33,VFRUH              0'0S %(7SURWHLQV ;,$3FDVSDVH ĮLQWHJULQ &&5 0LFURWXEXOH &;&5 %&/%$; 1$( ȕFDWHQLQ&%3 ,$3 $MJOJDBMUSJBMFYBNQMFT *OU+.PM4DJ  'JHVSF
  10. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ "TBGVUVSFQSPTQFDU 2&11*DBOCFVTFEBTBSFXBSEJOTFRVFODFCBTFENPMFDVMBS HFOFSBUJPONPEFMTVTJOHSFJOGPSDFNFOUMFBSOJOHBOEBTBDPOEJUJPOGPSTFRVFODF CBTFENPMFDVMBSHFOFSBUJPONPEFMTVTJOHDPOEJUJPOBM("/PS7"& XIJDIXJMMFOBCMF NPMFDVMBSEFTJHOXJUIIJHI11*UBSHFUJOHDPNQPVOEQSPQFSUJFT  5PXBSETUIFBQQMJDBUJPOPGNPMFDVMBSHFOFSBUJPOCZ3- ("/BOE7"&

    &YBNQMFPGDPNCJOBUJPOPG2&11* XJUIDPOEJUJPOBM7"& 6TF2&11*TDPSFBTBDPOEJUJPO .PMDVMBSQIZTJDPDIFNJDBMQSPQFSUZ .8 "-PH1 514" ʜ 2&11*TDPSF -BUFOU TQBDF &ODPEFS %FDPEFS (FOFSBUPS %JTDSJNJOBUPS 3FJOGPSDFNFOU MFBSOJOH .PMDVMBS(SBQI [dQ [ PS PS &WBMVBUFXJUI2&11*TDPSF &YBNQMFPGDPNCJOBUJPOPG2&11* XJUISFJOGPSDFNFOUMFBSOJOHBOE("/
  11. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿେ·͔ͳྲྀΕ   1BDLBHFԽʹඞཁͳϞδϡʔϧͷΠϯετʔϧ  1BDLBHFιʔεͷ࡞੒ @@JOJU@@QZͷ࡞੒ ϝΠϯιʔεͷ࡞੒ ."/*'&45JOͷ࡞੒

    TFUVQQZͷ࡞੒ 3&"%.&NEͷ࡞੒ˡ͜Ε͸׬ྃࡁΈͱ͍͏લఏ -*$&/4&ͷ࡞੒ɹɹˡ͜Ε͸׬ྃࡁΈͱ͍͏લఏ  5XJOFΛ࢖ͬͯ1Z1*ʹొ࿥
  12. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ1BDBLHF࡞੒ࣄલ४උ  # ඞཁͳύοέʔδΛΠϯετʔϧ͓ͯ͘͠ % python3 -m pip install

    --upgrade setuptools wheel twine جຊతʹɺQBDLBHFԽʹඞཁͳɺTFUVQUPPMT ͱXIFFM͸JOTUBMMࡁΈͳ͜ͱ͕ଟ͍Ͱ͕͢ɺ VQHSBEFΛߦ͍·͢ɻ ·ͨޙड़͠·͕͢1Z1*ͷVQMPBE༻ʹUXJOFΛ ࢖͏ͷͰɺͪ͜Β΋Πϯετʔϧ͠·͢ɻ ஫ҙ Ϟδϡʔϧͷ࣮ߦ؀ڥͱ͸ผʹ1Z1*΁ͷ VQMPBE༻ʹQZFOWͳͲͰ؀ڥΛ੾Γ෼͚͔ͯ Β࣮ߦͨ͠΄͏͕ྑ͍͔ͱࢥ͍·͢ɻ
  13. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ@@JOJU@@QZͷ࡞੒  # ϑΝΠϧߏ଄ % tree . !"" setup.py

    !"" MANIFEST.in !"" QEPPI ← ͜͜ΛϞδϡʔϧ໊ͱ߹Θ͓ͤͯ͘ͱ٢ # !"" __init__.py # !"" QEPPI.py # !"" constant.py # !"" util.py # %"" version.py !"" README.md !"" LICENSE @@JOJU@@QZύοέʔδجຊ৘ใΛهड़͠·͢ɻ w ίϐʔϥΠτ w όʔδϣϯ w ϥΠηϯε w ஶ࡞ऀ໊ w ஶ࡞ऀϝʔϧΞυϨε w 63-ʢ(JU)VCͷ63-ͳͲʣ ϙΠϯτ @@JOJU@@QZͷ๯಄ͷ GSPNϑΝΠϧJNQPSU  Λ΍͓͔ͬͯͳ͍ͱ͏·͍͔͘ͳ͍ͷͰɺ๨Εͣʹɻ ύοέʔδͷجຊ৘ใΛهड़ # __init__.pyͷྫ from .constant import * from .util import * from .QEPPI import * __copyright__ = "Copyright (C) 2021 Ohuelab” __version__ = "0.1.10" __license__ = "MIT" __author__ = "blacktanktop" __author_email__ = "[email protected]" __url__ = "http://github.com/ohuelab/QEPPI"
  14. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ.BJOιʔεͷ࡞੒  # ϑΝΠϧߏ଄ % tree . !"" setup.py

    !"" MANIFEST.in !"" QEPPI ← ͜͜ΛϞδϡʔϧ໊ͱ߹Θ͓ͤͯ͘ͱ٢ # !"" __init__.py # !"" QEPPI.py # !"" constant.py # !"" util.py # %"" version.py !"" README.md !"" LICENSE # version.pyͷྫ __version__ = "0.1.10" ύοέʔδʹඞཁͳΫϥεɾؔ਺܈ ؊৺ͷύοέʔδͷ.BJOؔ਺Ͱ͢ɻ ࠓճͰ͸ɺ2&11*Λܭࢉ͢ΔͨΊͷؔ਺܈ʹͳΓ·͢ɻ ·ͨɺWFSTJPOQZʹ͓WFSTJPOΛهࡌ͢Δ͜ͱ΋ՄೳͰ ͢ɻʢ@@JOJU@@QZ͔֎ʹग़͔͢Ͳ͔ͬͪʣ ύοέʔδʹඞཁͳΫϥεɾؔ਺܈ @@JOJU@@QZͰͳ͘͜͜ʹॻ͘͜ͱ΋Մೳ
  15. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ."/*'&45JOͷ࡞੒  # ϑΝΠϧߏ଄ % tree . !"" setup.py

    !"" MANIFEST.in !"" QEPPI ← ͜͜ΛϞδϡʔϧ໊ͱ߹Θ͓ͤͯ͘ͱ٢ # !"" __init__.py # !"" QEPPI.py # !"" constant.py # !"" util.py # %"" version.py !"" README.md !"" LICENSE # MANIFEST.in ͷྫ include *.md exclude README.md include requirements.txt ← setup.pyͰ࢖͏࣌͸ඞͣೖΕΔ ϑΝΠϧߏ଄͸͜ͷ༷ͳܗͰ࿩ΛਐΊ·͢ɻ ."/*'&45JOΦϓγϣϯͰ͢ɻύοέʔδʹ௥Ճɺɹ ·ͨ͸আ֎͢ΔϑΝΠϧΛهड़͠·͢ɻ SFRVJSFNFOUTUYUͳͲɻ -*$&/4& 3&"%.&NETFUVQQZͳͲ͸ࢦఆͤͣͱ΋ উखʹύοέʔδϯά͞Ε·͢ɻऔΓআ͖͍ͨ৔߹͸ FYDMVEFͰؚ͋͑ͯ·ͤͳ͍ͱ͍ͬͨ͜ͱ͕ग़དྷ·͢ɻ ·ͨɺTFUVQQZͷ࢓༷ͰSFRVJSFNFOUTUYUΛ࢖͏৔߹͸ ."/*'&45JOʹॻ͔ͳ͍ͱౖΒΕ·͢ͷͰඞͣॻ͖· ͠ΐ͏ɻ ύοέʔδʹ௥Ճɺ·ͨ͸ আ֎͢ΔϑΝΠϧΛهड़͢Δ
  16. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿTFUVQQZͷ࡞੒  # ϑΝΠϧߏ଄ % tree . !"" setup.py

    !"" MANIFEST.in !"" QEPPI ← ͜͜ΛϞδϡʔϧ໊ͱ߹Θ͓ͤͯ͘ͱ٢ # !"" __init__.py # !"" QEPPI.py # !"" constant.py # !"" util.py # %"" version.py !"" README.md !"" LICENSE TFUVQQZύοέʔδ࡞੒৘ใΛهड़͠·͢ɻ ύοέʔδ࡞੒৘ใΛهड़͠·͢ɻ
  17. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ # setup.pyͷྫ from setuptools import setup exec(open("QEPPI/version.py").read()) with open("README.md",

    "r", encoding="utf-8") as fh: long_description = fh.read() setup( name="QEPPI", version=__version__, author="blacktanktop, author_email=“[email protected]", description="Calculation module of QEPPI", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/ohuelab/QEPPI/", license="MIT", packages=["QEPPI"], install_requires=[ "rdkit-pypi>=2021.3.1.5", "numpy>=1.19.5", "pandas>=1.1.5", ], classifiers=[ "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Chemistry", "Topic :: Scientific/Engineering :: Bio-Informatics", ], ) 1Z1*ͷొ࿥·ͰͷಓͷΓɿTFUVQQZͷ࡞੒  TFUVQQZύοέʔδ࡞੒৘ใΛهड़͠·͢ɻ OBNFύοέʔδ໊শ WFSTJPOόʔδϣϯ BVUIPSஶ࡞ऀ໊ BVUIPS@FNBJMஶ࡞ऀͷϝʔϧΞυϨε EFTDSJQUJPO؆୯ͳઆ໌ MPOH@EFTDSJQUJPOৄࡉͷઆ໌ʢ3&"%.&NEʣ VSMύοέʔδͷ(JU)VCͷϦϙδτϦ63- MJDFOTFύοέʔδͷϥΠηϯεʢ.*5ͳͲʣ QBDLBHFTϞδϡʔϧϦετ JOTUBMM@SFRVJSFTґଘؔ܎ͷ͋Δύοέʔδ DMBTTJGJFST෼ྨޠͷϦετʢ1Z1*Ͱ෼ྨϦετ͕͋Δʣ
  18. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿTFUVQQZͷ࡞੒  # setup.pyͷྫ from setuptools import setup exec(open("QEPPI/version.py").read())

    with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read() setup( name="QEPPI", version=__version__, author="blacktanktop, author_email=“[email protected]", description="Calculation module of QEPPI", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/ohuelab/QEPPI/", license="MIT", packages=["QEPPI"], install_requires=[ "rdkit-pypi>=2021.3.1.5", "numpy>=1.19.5", "pandas>=1.1.5", ], classifiers=[ "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Chemistry", "Topic :: Scientific/Engineering :: Bio-Informatics", ], ) ิ଍ ͸WFSJPOQZʹॻ͍ͯ͋ΔWFSTJPOΛಡΈࠐΜͰɺ όʔδϣϯΛม਺Ͱ؅ཧ͢ΔͨΊͰ͢ɻ MPOH@EFTDSJQUJPOͱ͍͏ม਺ʹ3&"%.&NEͷςΩετ ΛಥͬࠐΉ͜ͱͰɺ1Z1*ʹొ࿥ͨ͠ͱ͖ͷը໘Λ 3&"%.&NEͱಉ͡ʹ͢ΔͨΊͷํ๏Ͱ͢ɻ JOTUBMM@SFRVJSFTΛSFRVJSFNFOUTUYUͰࢦఆ͍ͨ͠৔߹͸ ҎԼͷΑ͏ͳઃఆํ๏͕͋Γ·͢ɻ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read() exec(open("QEPPI/version.py").read()) def _requires_from_file(filename): return open(filename).read().splitlines() # ্هͷؔ਺Λ࡞͓͍ͬͯͯɺҎԼͷ༷ʹ͢Δɻ install_requires=_requires_from_file("requirements.txt") 3&"%.&NEΛಡΈࠐΜͰɺ MPOH@EFTDSJQUJPO΁ม਺Խ
  19. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿTFUVQQZͷ࡞੒  # setup.cfgͷྫ [metadata] name = package_name version

    = attr: src.VERSION description = short package description long_description = file: README.md keywords = foo, bar license = MIT License classifiers = Programming Language :: Python :: 3.7 [options] zip_safe = False include_package_data = True packages = find: scripts = bin/first.py bin/second.py install_requires = pandas numpy; python_version == "3.7" [options.package_data] * = *.md ͓·͚ TFUVQDGHɿ࠷ۙͰ͸TFUVQQZ͸γϯϓϧʹͯ͠ɺ TFUVQDGHͱ͍͏DPOGJHϑΝΠϧʹશ෦ઃఆΛॻ͘ͱ͍ ͏ͷ͕ओྲྀͩͦ͏Ͱ͢ɻ ӈʹྫΛ͓͖ࣔͯ͠·ͨ͠ɻJOJϑΝΠϧͬΆ͍Ͱ͢Ͷɻ ͯ͞ɺ͜ΕͰԼ४උ͕Ͱ͖·ͨ͠ʂ ͋ͱ͸Ϗϧυͯ͠1Z1*ʹVQ͢Δ͚ͩͰ͢ɻ
  20. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿͪΐͬͱςετ  # ͪΐͬͱςετ % python setup.py install %

    python >>> import QEPPI >>> QEPPI.__version__ '0.1.10' TFUVQQZJOTUBMMɿ ͜͜·Ͱ͘ΔͱɺϩʔΧϧʹΠϯετʔϧ͕Ͱ͖·͢ɻ QJQMJTUɿ QJQMJTU͢Ε͹ɺύοέʔδ͕Πϯετʔϧ͞Ε͍ͯΔͷ ͕Θ͔Γ·͢ɻ ӈͷΑ͏ʹɺίϚϯυ͔ΒΠϯλϓϦλΛݺͼग़͠ɺ όʔδϣϯ֬ೝͳͲߦͬͯɺಡΈࠐΈ͕ਖ਼ৗ͔֬ೝ͢Δ ͱྑ͍Ͱ͠ΐ͏ɻ
  21. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿϏϧυͷ४උ  # ͪΐͬͱςετ % python setup.py sdist bdist_wheel

    % tree . !"" setup.py !"" MANIFEST.in !"" QEPPI # !"" QEPPI.py # !"" __init__.py # !"" constant.py # !"" util.py # %"" version.py !"" QEPPI.egg-info # !"" PKG-INFO # !"" SOURCES.txt # !"" dependency_links.txt # !"" requires.txt # %"" top_level.txt !"" build # !"" bdist.macosx-10.12-x86_64 # %"" lib # %"" QEPPI # !"" QEPPI.py # !"" __init__.py # !"" constant.py # !"" util.py # %"" version.py !"" dist # !"" QEPPI-0.1.10-py3-none-any.whl # %"" QEPPI-0.1.10.tar.gz !"" README.md !"" LICENSE TFUVQQZTEJTUɿ ιʔε഑෍෺ UBSH[GJMF Λ࡞੒͠·͢ɻ TFUVQQZCEJTU@XIFFMɿ ϏϧυࡁΈͷ഑෍෺ XIM Λ࡞੒͠·͢ɻ ͜ΕΒͷίϚϯυͰɺύοέʔδΛVQMPBE͢ΔͨΊͷ ϑΝΠϧ͕ੜ੒͞Ε·͢ɻ CEJTU@XIFFMͰ࡞੒͞ΕΔϑΝΠϧ TEJTUͰ࡞੒͞ΕΔϑΝΠϧ TEJTUͰ࡞੒͞ΕΔϑΝΠϧ
  22. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿιʔεϑΝΠϧͷத਎  # QEPPI-0.1.10.tar.gzͷத਎ . !"" setup.cfg !"" setup.py

    !"" MANIFEST.in !"" PKG-INFO !"" QEPPI # !"" QEPPI.py # !"" __init__.py # !"" constant.py # !"" util.py # %"" version.py !"" QEPPI.egg-info # !"" PKG-INFO # !"" SOURCES.txt # !"" dependency_links.txt # !"" requires.txt # %"" top_level.txt !"" README.md !"" LICENSE 2&11*UBSH[ͷத਎͸ӈͷͱ͓ΓͰ͢ɻ XIMϑΝΠϧ͸όΠφϦϑΝΠϧͱͳΓ·͢ɻ QJQJOTUBMM͞Εͨ࣌͸͜ͷόΠφϦϑΝΠϧ͕μ΢ϯ ϩʔυ͞ΕͯɺϩʔΧϧʹΠϯετʔϧ͞Ε·͢ɻ ͳͷͰɺNBYPT༻ɺMJOVY༻ͱ͍ͬͨ۩߹ʹ༷ʑͳ ϓϥοτϑΥʔϜͷόΠφϦ͕͋Δͱ൚༻ੑ͕૿͠·͢ ࣍͸ɺ͜ͷͭͷϑΝΠϧΛ1Z1*ʹVQMPBE͠·͢ʂ
  23. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ5FTU1Z1*΁ͷVQMPBE  # TestPyPI΁ͷupload % twine upload --repository-url https://test.pypi.org/legacy/

    dist/* Uploading distributions to https://test.pypi.org/legacy/ Uploading QEPPI-0.1.10-py3-none-any.whl 100%|█████████████████████████████| 12.1k/12.1k [00:01<00:00, 6.68kB/s] Uploading QEPPI-0.1.10.tar.gz 100%|█████████████████████████████| 11.9k/11.9k [00:02<00:00, 5.86kB/s] View at: https://test.pypi.org/project/QEPPI/0.1.10/ # ϑΝΠϧͷத਎Λมߋͯ͠ɺversion͕ಉͩ͡ͱҎԼͷΑ͏ʹͳΔ NOTE: Try --verbose to see response content. HTTPError: 400 Bad Request from https://test.pypi.org/ legacy/ File already exists. See https://test.pypi.org/help/ #file-name-reuse for more information. ஫ҙ 3&"%.&NEΛͦͷ··MPOHEFTDSJQUJPOʹઃఆ͍ͯ͠ Δ৔߹͸ɺຊ౰ʹࠓͷ3&"%.&NEͰྑ͍͔Λ͔ͬ͠Γ ݕ౼ͯ͠ɺ΍Γ͖͔ͬͯΒVQʹਐΜͩ΄͏͕ྑ͍Ͱ͢ɻ 5FTU1Z1*΋1Z1*΋VQMPBEͷ΍Γ௚͕͠Ͱ͖·ͤΜɻ WFSTJPOΛಉ͡··ͰɺEFTDSJQUJPO͚ͩม͍͑ͨͱ͍͏ ͜ͱ͕Ͱ͖ͳ͍ͷͰؾΛ͚ͭ·͠ΐ͏ɻ ࠶౓VQMPBE͢Δ৔߹͸WFSTJPOΛগ͠Ͱ΋͍͍͔Β্͛ ΔʢͳΒͱ͔ʣ࡟আͯ͠΋ಉ໊͡લͩͱه࿥ ͕࢒͍ͬͯΔͷͰɺ࡟আͯ͠΋μϝͰ͢ɻ
  24. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ5FTU1Z1*΁ͷVQMPBE  # TestPyPI΁ͷupload % twine upload --repository-url https://pypi.org/legacy/

    dist/* Enter your username: Enter your password: Uploading distributions to https://test.pypi.org/legacy/ Uploading QEPPI-0.1.10-py3-none-any.whl 100%|█████████████████████████████| 12.1k/12.1k [00:01<00:00, 6.68kB/s] Uploading QEPPI-0.1.10.tar.gz 100%|█████████████████████████████| 11.9k/11.9k [00:02<00:00, 5.86kB/s] View at: https://test.pypi.org/project/QEPPI/0.1.10/ # TestPyPI͔Βpip install͢Δ % pip install -i https://test.pypi.org/simple/ QEPPI Collecting QEPPI Downloading QEPPI-0.1.10-py3-none-any.whl (6.7 kB) Collecting rdkit-pypi>=2021.3.1.5 Downloading rdkit_pypi-2021.3.5.1-cp38-cp38-macosx_10_9_x86_64.whl (16.1 MB) |████████████████████████████████| 16.1 MB 3.7 MB/s Collecting numpy>=1.19.5 Downloading numpy-1.21.2-cp38-cp38-macosx_10_9_x86_64.whl (16.9 MB) |████████████████████████████████| 16.9 MB 4.7 MB/s Collecting pandas>=1.1.5 Downloading pandas-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl (11.4 MB) |████████████████████████████████| 11.4 MB 3.8 MB/s Requirement already satisfied: pytz>=2017.3 in /Users/lily/.pyenv/versions/3.8.2/envs/ test_QEPPI/lib/python3.8/site-packages (from pandas>=1.1.5->QEPPI) (2021.3) Requirement already satisfied: python-dateutil>=2.7.3 in /Users/lily/.pyenv/versions/3.8.2/ envs/test_QEPPI/lib/python3.8/site-packages (from pandas>=1.1.5->QEPPI) (2.8.2) Requirement already satisfied: six>=1.5 in /Users/lily/.pyenv/versions/3.8.2/envs/test_QEPPI/ lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas>=1.1.5->QEPPI) (1.16.0) Installing collected packages: numpy, rdkit-pypi, pandas, QEPPI Successfully installed QEPPI-0.1.10 numpy-1.21.2 pandas-1.3.3 rdkit-pypi-2021.3.5.1 UXJOFVQMPBESFQPTJUPSZVSMIUUQTUFTUQZQJPSHMFHBDZEJTU  ͱ͢ΔͱɺVTFSOBNFͱQBTTΛٻΊΒΕΔͷͰೖྗ͠·͢ ςετ؀ڥ͍ͬͯ͏͚ͩͰɺݟͨ໨͸ຊ൪ͱ΄ͱΜͲมΘΓ ·ͤΜɻ1SPKFDUEFTDSJQUJPO͕ଥ౰͔࠶౓ݕ౼͠·͠ΐ ͏ɻ ӈͷΑ͏ʹQJQJOTUBMMͯ͠ڍಈ΋֬ೝ͠ɺඞཁʹԠͯ͡ςε τίʔυͳͲΛ૸ΒͤΔͱྑ͍Ͱ͠ΐ͏ɻ XIMϑΝΠϧ͕μ΢ϯϩʔυ͞Ε͍ͯΔ VTFSOBNFͱQBTTΛٻΊΒΕΔ IUUQTUFTUQZQJPSHQSPKFDU2&11*
  25. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ 1Z1*ͷొ࿥·ͰͷಓͷΓɿ1Z1*΁ͷVQMPBE  # TestPyPI΁ͷupload % twine upload --repository-url https://pypi.org/legacy/

    dist/* Enter your username: Enter your password: Uploading distributions to https://pypi.org/legacy/ Uploading QEPPI-0.1.10-py3-none-any.whl 100%|█████████████████████████████| 12.1k/12.1k [00:01<00:00, 6.68kB/s] Uploading QEPPI-0.1.10.tar.gz 100%|█████████████████████████████| 11.9k/11.9k [00:02<00:00, 5.86kB/s] View at: https://pypi.org/project/QEPPI/0.1.10/ # PyPI͔Βpip install͢Δ % pip install -i https://pypi.org/simple/ QEPPI Collecting QEPPI Downloading QEPPI-0.1.10-py3-none-any.whl (6.7 kB) Collecting rdkit-pypi>=2021.3.1.5 Downloading rdkit_pypi-2021.3.5.1-cp38-cp38-macosx_10_9_x86_64.whl (16.1 MB) |████████████████████████████████| 16.1 MB 3.7 MB/s Collecting numpy>=1.19.5 Downloading numpy-1.21.2-cp38-cp38-macosx_10_9_x86_64.whl (16.9 MB) |████████████████████████████████| 16.9 MB 4.7 MB/s Collecting pandas>=1.1.5 Downloading pandas-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl (11.4 MB) |████████████████████████████████| 11.4 MB 3.8 MB/s Requirement already satisfied: pytz>=2017.3 in /Users/lily/.pyenv/versions/3.8.2/envs/ test_QEPPI/lib/python3.8/site-packages (from pandas>=1.1.5->QEPPI) (2021.3) Requirement already satisfied: python-dateutil>=2.7.3 in /Users/lily/.pyenv/versions/3.8.2/ envs/test_QEPPI/lib/python3.8/site-packages (from pandas>=1.1.5->QEPPI) (2.8.2) Requirement already satisfied: six>=1.5 in /Users/lily/.pyenv/versions/3.8.2/envs/test_QEPPI/ lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas>=1.1.5->QEPPI) (1.16.0) Installing collected packages: numpy, rdkit-pypi, pandas, QEPPI Successfully installed QEPPI-0.1.10 numpy-1.21.2 pandas-1.3.3 rdkit-pypi-2021.3.5.1 UXJOFVQMPBESFQPTJUPSZVSMIUUQTQZQJPSHMFHBDZEJTU  VTFSOBNFͱQBTTΛٻΊΒΕΔͷͰೖྗ͠·͢ ӈͷΑ͏ʹQJQJOTUBMMͯ͠ڍಈ΋֬ೝ͠ɺඞཁʹԠͯ͡ ςετίʔυͳͲΛ૸ΒͤΔͱྑ͍Ͱ͠ΐ͏ɻ ͜ΕͰ1Z1*ͷొ࿥͸׬ྃͰ͢ɻ VTFSOBNFͱQBTTΛٻΊΒΕΔ XIMϑΝΠϧ͕μ΢ϯϩʔυ͞Ε͍ͯΔ IUUQTQZQJPSHQSPKFDU2&11* IUUQTQZQJPSHQSPKFDU2&11*
  26. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ .BLFGJMFʹΑΔλεΫઃఆɿQZQJSDͷ࡞੒  # ~/.pypirc [distutils] index-servers = pypi testpypi

    [pypi] username = __token__ password = pypi-~~~tokenΛೖΕΔ [testpypi] username = __token__ password = pypi-~~~tokenΛೖΕΔ ͜Ε͔ΒόʔδϣϯΛ্͍͛ͯ͘ͱ͖ʹศརͳ༷ʹ .BLFGJMFΛ࢖ͬͯɺλεΫԽͯ͠͠·͍·͠ΐ͏ɻ ͦͷલʹɺຖճύεΛೖΕΔͷ΋ηΩϡϦςΟతʹ΋ ͪΐͬͱඍົͳͷͱ໘౗ͳͷͰɺ"1*UPLFOΛ࢖ͬͯ ొ࿥ग़དྷΔΑ͏ʹ͠·͢ɻΞΧ΢ϯτઃఆͷԼͷํ͔Β औಘग़དྷΔͷͰͦΕͧΕऔಘͯ͠Լ͍͞ɻ "1*UPLFOΛऔಘͨ͠ΒӈͷΑ͏ʹdQZQJSDΛ࡞ͬͯ Լ͍͞ɻVTFSOBNFΛUPLFOͱ͢ΔͱQBTT͸"1*UPLFO ͱೝࣝ͢ΔΑ͏Ͱ͢ɻ ʢͪͳΈʹ͜͜ʹɺࣗ෼ͷVTFSOBNFͱQBTTΛॻ͍ͯ΋ ྑ͍Ͱ͕͢UPLFOͷ΄͏͕҆શͰ͢Ͷɻʣ ஫ҙɿ"1*UPLFO͸QZQJ΋ؚΊͯԼ͍͞ɻ
  27. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ .BLFGJMFʹΑΔλεΫઃఆɿ.BLFGJMFͷ࡞੒  # Makefile .DEFAULT_GOAL := help # all

    targets are phony .PHONY: $(shell egrep -o ^[a-zA-Z0-9_-]+: $(MAKEFILE_LIST) | sed 's/://') clean: ## Clean @echo 'Clean $@' rm -rf {Package_Name}.egg-info/* dist/* -y @echo 'Finished $@' build: ## Build @echo 'Build $@' python setup.py sdist bdist_wheel @echo 'Finished $@' test-deploy: ## Upload test PyPI @echo 'Upload test PyPI $@' twine upload -r testpypi dist/* @echo 'Finished $@' deploy: ## Upload PyPI @echo 'Upload PyPI $@' twine upload -r pypi dist/* @echo 'Finished $@' help: ## Print this help @echo 'Usage: make [target]' @echo '' @echo 'Targets:' @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) ͜Ε·ͰͷίϚϯυΛ·ͱΊͨ.BLFGJMFʹͳΓ·͢ɻ NBLFDMFBO Ұ౓ɺ#VJME͢ΔͱFHH*OGPͱ͔EJTUͷલͷόʔδϣϯ ͕࢒ͬͨ··ʹͳͬͯ͠·͍·͢ɻ ͳͷͰɺDMFBOͰաڈͷύοέʔδΛফ͠·͢ɻ ୯७ʹSNSGͰফ͍ͯ͠Δ͚ͩͰ͢ɻ NBLFCVJME Ϗϧυͯ͠VQMPBE͢ΔͨΊͷEJTUͱXIMΛ࡞Γ·͢ɻ NBLFUFTUEFQMPZ 5FTU1Z1*ʹVQ͠·͢ɻ NBLFEFQMPZ 1Z1*ʹVQ͠·͢ɻ λεΫԽ͓ͯ͘͠ͱɺ͠͹Β͘ܦ͔ͬͯΒͷόʔδϣϯ ߋ৽ͷࡍʹ΋ɺهԱʹ༏࣮͘͠ߦͰ͖·͢ɻ
  28. 0DUUI#JP1BDLBUIPO5BLBUTVHV,PTVHJ ·ͱΊ w Խ߹෺ͷ11*ΛඪతʹͰ͖ͦ͏ͳ౓߹͍ΛఆྔతʹධՁ͢Δࢦඪ2&11*Λ։ൃ͠·ͨ͠ɻ 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPOT w 1Z1*ͷొ࿥·ͰͷಓͷΓ w 1BDLBHF࡞੒ࣄલ४උ w

    TFUVQUPPMT XIFFM UXJOFͷΠϯετʔϧɻ w 1BDLBHFιʔεͷ࡞੒ w TFUVQQZΛؚΉɺܗࣜతͳϑΝΠϧߏ଄Ͱ࡞੒ɻTFUVQQZʹύοέʔδ࡞੒৘ใΛهड़ɻ w 1BDLBHFͷϏϧυ w TFUVQQZTEJTUCEJTU@XIFFMʹΑΔɺιʔε഑෍෺ͱόΠφϦ഑෍෺ͷ࡞੒ɻ w 1Z1*΁ͷVQMPBE w UXJOFΛ࢖ͬͨVQMPBEɻUFTU؀ڥͰςετ͔ͯ͠Βɺຊ൪؀ڥʹVQMPBEɻ w .BLFGJMFʹΑΔλεΫઃఆ w QZQJSDͷઃఆɻ.BLFGJMFͰλεΫԽ͓ͯ͘͜͠ͱͰϑϩʔΛཧղ͠΍ͨ͘͢͠ɻ  ,PTVHJ 50IVF . 2VBOUJUBUJWF&TUJNBUF*OEFYGPS&BSMZ4UBHF4DSFFOJOHPG$PNQPVOET5BSHFUJOH1SPUFJO1SPUFJO*OUFSBDUJPOT *OU+.PM4DJ  IUUQTEPJPSHJKNT IUUQTQZQJPSHQSPKFDU2&11*