From 87e92383650ad1f551982932d1e028fd25d921f0 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 19 Nov 2018 10:29:25 +0100 Subject: [PATCH] add: More documentation on expansion modules --- doc/expansion/crowdstrike_falcon.json | 4 ++-- doc/expansion/dbl_spamhaus.json | 7 ++++++- doc/expansion/dns.json | 6 +++++- doc/expansion/domaintools.json | 7 ++++++- doc/expansion/eupi.json | 7 ++++++- doc/expansion/farsight_passivedns.json | 7 ++++++- doc/expansion/geoip_country.json | 8 +++++++- doc/logos/maxmind.png | Bin 0 -> 25782 bytes 8 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 doc/logos/maxmind.png diff --git a/doc/expansion/crowdstrike_falcon.json b/doc/expansion/crowdstrike_falcon.json index 4392561..07e9dbd 100644 --- a/doc/expansion/crowdstrike_falcon.json +++ b/doc/expansion/crowdstrike_falcon.json @@ -3,7 +3,7 @@ "logo": "logos/crowdstrike.png", "requirements": ["A CrowdStrike API access (API id & key)"], "input": "A MISP attribute included in the following list:\n- domain\n- email-attachment\n- email-dst\n- email-reply-to\n- email-src\n- email-subject\n- filename\n- hostname\n- ip-src\n- ip-dst\n- md5\n- mutex\n- regkey\n- sha1\n- sha256\n- uri\n- url\n- user-agent\n- whois-registrant-email\n- x509-fingerprint-md5", - "output": "MISP attributes fetched after the CrowdStrike API has been queried, included in the following list:\n- hostname\n- email-src\n- email-subject\n- filename\n- md5\n- sha1\n- sha256\n- ip-dst\n- ip-dst\n- mutex\n- regkey\n- url\n- user-agent\n- x509-fingerprint-md5", + "output": "MISP attributes mapped after the CrowdStrike API has been queried, included in the following list:\n- hostname\n- email-src\n- email-subject\n- filename\n- md5\n- sha1\n- sha256\n- ip-dst\n- ip-dst\n- mutex\n- regkey\n- url\n- user-agent\n- x509-fingerprint-md5", "references": ["https://www.crowdstrike.com/products/crowdstrike-falcon-faq/"], - "features": "This module takes a MISP attribute as input to query a CrowdStrike Falcon API, using an api_id and an apikey.\n\nThe API returns then the result of the query with some types we map into compatible types we add as MISP attributes." + "features": "This module takes a MISP attribute as input to query a CrowdStrike Falcon API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes.\n\nPlease note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported." } diff --git a/doc/expansion/dbl_spamhaus.json b/doc/expansion/dbl_spamhaus.json index b691007..ea73dcb 100644 --- a/doc/expansion/dbl_spamhaus.json +++ b/doc/expansion/dbl_spamhaus.json @@ -1,4 +1,9 @@ { "description": "Module to check Spamhaus DBL for a domain name.", - "logo": "logos/spamhaus.jpg" + "logo": "logos/spamhaus.jpg", + "requirements": ["dnspython3: DNS python3 library"], + "input": "Domain or hostname attribute.", + "output": "Information about the nature of the input.", + "references": ["https://www.spamhaus.org/faq/section/Spamhaus%20DBL"], + "features": "This modules takes a domain or a hostname in input and queries the Domain Block List provided by Spamhaus to determine what kind of domain it is.\n\nDBL then returns a response code corresponding to a certain classification of the domain we display. If the queried domain is not in the list, it is also mentionned.\n\nPlease note that composite MISP attributes containing domain or hostname are supported as well." } diff --git a/doc/expansion/dns.json b/doc/expansion/dns.json index 2ca7e42..dc43b64 100644 --- a/doc/expansion/dns.json +++ b/doc/expansion/dns.json @@ -1,3 +1,7 @@ { - "description": "A simple DNS expansion service to resolve IP address from MISP attributes." + "description": "A simple DNS expansion service to resolve IP address from domain MISP attributes.", + "requirements": ["dnspython3: DNS python3 library"], + "input": "Domain or hostname attribute.", + "output": "IP address resolving the input.", + "features": "The module takes a domain of hostname attribute as input, and tries to resolve it. If no error is encountered, the IP address that resolves the domain is returned, otherwise the origin of the error is displayed.\n\nThe address of the DNS resolver to use is also configurable, but if no configuration is set, we use the Google public DNS address (8.8.8.8).\n\nPlease note that composite MISP attributes containing domain or hostname are supported as well." } diff --git a/doc/expansion/domaintools.json b/doc/expansion/domaintools.json index 5ed0cb2..849028c 100644 --- a/doc/expansion/domaintools.json +++ b/doc/expansion/domaintools.json @@ -1,4 +1,9 @@ { "description": "DomainTools MISP expansion module.", - "logo": "logos/domaintools.png" + "logo": "logos/domaintools.png", + "requirements": ["Domaintools python library", "A Domaintools API access (username & apikey)"], + "input": "A MISP attribute included in the following list:\n- domain\n- hostname\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-name\n- whois-registrant-phone\n- ip-src\n- ip-dst", + "output": "MISP attributes mapped after the Domaintools API has been queried, included in the following list:\n- whois-registrant-email\n- whois-registrant-phone\n- whois-registrant-name\n- whois-registrar\n- whois-creation-date\n- text\n- domain", + "references": ["https://www.domaintools.com/"], + "features": "This module takes a MISP attribute as input to query the Domaintools API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes.\n\nPlease note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported." } diff --git a/doc/expansion/eupi.json b/doc/expansion/eupi.json index 42da8aa..02a16fb 100644 --- a/doc/expansion/eupi.json +++ b/doc/expansion/eupi.json @@ -1,4 +1,9 @@ { "description": "A module to query the Phishing Initiative service (https://phishing-initiative.lu).", - "logo": "logos/eupi.png" + "logo": "logos/eupi.png", + "requirements": ["pyeupi: eupi python library", "An access to the Phishing Initiative API (apikey & url)"], + "input": "A domain, hostname or url MISP attribute.", + "output": "Text containing information about the input, resulting from the query on Phishing Initiative.", + "references": ["https://phishing-initiative.eu/?lang=en"], + "features": "This module takes a domain, hostname or url MISP attribute as input to query the Phishing Initiative API. The API returns then the result of the query with some information about the value queried.\n\nPlease note that composite attributes containing domain or hostname are also supported." } diff --git a/doc/expansion/farsight_passivedns.json b/doc/expansion/farsight_passivedns.json index 6fd038b..2c1bf05 100644 --- a/doc/expansion/farsight_passivedns.json +++ b/doc/expansion/farsight_passivedns.json @@ -1,4 +1,9 @@ { "description": "Module to access Farsight DNSDB Passive DNS.", - "logo": "logos/farsight.png" + "logo": "logos/farsight.png", + "requirements": ["An access to the Farsight Passive DNS API (apikey)"], + "input": "A domain, hostname or IP address MISP attribute.", + "output": "Text containing information about the input, resulting from the query on the Farsight Passive DNS API.", + "references": ["https://www.farsightsecurity.com/"], + "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. The API returns then the result of the query with some information about the value queried." } diff --git a/doc/expansion/geoip_country.json b/doc/expansion/geoip_country.json index fb3bf33..9db49a2 100644 --- a/doc/expansion/geoip_country.json +++ b/doc/expansion/geoip_country.json @@ -1,3 +1,9 @@ { - "description": "Module to query a local copy of Maxminds Geolite database." + "description": "Module to query a local copy of Maxmind's Geolite database.", + "logo": "logos/maxmind.png", + "requirements": ["A local copy of Maxmind's Geolite database"], + "input": "An IP address MISP Attribute.", + "output": "Text containing information about the location of the IP address.", + "references": ["https://www.maxmind.com/en/home"], + "features": "This module takes an IP address MISP attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the location of this IP address.\n\nPlease note that composite attributes domain|ip are also supported." } diff --git a/doc/logos/maxmind.png b/doc/logos/maxmind.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8a6c6eeb86e4da5c024539b7ab4c6d492bf398 GIT binary patch literal 25782 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

Cz4h}SCsQ>(uw*xfx`$x@&WLHZ z-NhZtiqllx;>vjZL$z1`x&4SrN{1ZpQ|Gs-mBC*j%R5o)cb{qsoS;K62*M|)x@Pef2*D+**`WqnL>Xi2O!gV z7U^G1z$;t;!sN2&!0(_8v?98#qm>L*BnD`K1O-Cu?=y94_b`dGHk$}7!E_JTHox)tr2_HD>ecP}V z64c9>+xV_;wA3g&|NLeHJhz&A@Ge(2TF!L)+voZoO6|cl0Ns=8$G5-RkNHPTSG$SX zmnNCqv^uNwx%2M*`!;677f4=~7ui#1UdlE2CgtQQ`nE&OIjJnKr+gBEUCR-MNnG)} z#LsPoe8pw27ak}^B|?F67PL0@k1~{Q+1^zm&~p8V z*VDSke#jr~`B^Lgd)2x4Vw>25jT+BW#o<;ajvk&V2jOMd^_!OzE}j%PpnabQEtoZ* zpb&W$HWxCflz)A8cDt4JVc#HjT)A3iP)=yJ2-A3XLjB|E_3ew>bD$9{+2POn^gZ~% z3nz|jtR;tEL83kW0{exT7RBt~WM$=GhsO1~#o!xaS1&7T*sY}QZ}%^es_mu-BPlD`9Y*$ z{ZQ3tRA*v+@(_Yj+RqyTVeB|Fk8ZE=uh-}`+8=rY(}d*``+bX=v9s)Cbm{0A zTH}VPPG4%k_Y*1fF4R0BS3@j5))2R=pr%K$aG;iq4Do7!BK(COI#e@&3YO>FE5cUGk^2R-|wqO)x4+Y+qL*bv`D;PG{-h~^~*lSvYZI@NQ%Ub`!4r480!%Y<2>mC!AAa%SGd{jink1ZFO1&7Rs3W-(5>wzBNY%U@QOoS zUltB#R4+!#i$;Xr-8yIH_Fsnf!LOC+VNdI&)FfVFt3zeoe&5iryLxFO$G)-P_#kL| z^&hV;eTYFd`6;UPD}{O4x07ZxC0iLEMRP~6lD5-N_-k(_JYs4J6?v92 z|A#udjQ&F%oE$cHV*ai|K^Cxa>FCTe$ByZ~68F+q*csazB)5wy9o2V`saqKwXTk7) zOD~dYWjtnxl#B#T?<}i$+H z&#jOkD^zY5wmFH)e0XQM5d@*78Sq)XS1K4AWG*H!TehdLfu*v*l8Giqs!#4u5w69i zcRAfv-IB#P(n&L(+Ag%^4hvJ(R=G*m_imM&7fVOS0b+0dwUEH14Zf(>qFHNq{w05n!e(l zs+p0&yEce*igW0vGuF2p7|e;2FLdq#aXQxC5c^{bS|#N6`9ky59kEX-=R?qtSc+!o z`Yz!Yom8NOgCDw-@`pfAu-*@d8};x{IbZ>^_JnyiXiYT;y)1r9OXP(&Eqa_BK0%=u{v)>e8D7mHl>m|{RyG5P{^6x*LRsP31 zyd{n{#x@28OW=V)DpjZgpqq{$EbxsIffkjY(F7e`N^|Gi=P+!P ziMlv^`K*|^^KfVB#h*{@A9vkX_9H?`mRg;i!hQN30_-meSHy{KGm1eyN`L&ZIbEA! z(LN+{TLy%+iL`tj3_)v}p$XQQ zgGG8W_~|5~ocHvU8@RKnoyI+%$loxf#3<}&hlcrw4N0;^zUgWXV9n_MG3(?#pJksm z9PxdNH=`O|DUkrc>E6&Y&X*>IMYMOyHs`z&}81*KMWG z8$|6i@8S}qnNR2Phv4y>c-}tlN0j2XKbmk&vhL+YQ-C57qPWXB4~CM|(9CDZgG%>n*2i=)tVkiC&L6Oon9v7bX<`Oy26 zxnlI1TM5L1USg6m;;&3hPVpq#YW5|JF-fYCcl0r$#3ee+R{@>RW(h^()J7_HF&(FA zA<3%QJX%KurvI{L*YVWH9hs1D7|6y!-YAlnM11){tZ}k8`zlM3#Bpt!&cS!KqdS9@ z?k)T4vjU{TT;D+d({{nuC?a!9?ud&QD-n<@gW z(7te>KU4w3a2dQ`6VUUuaAj=z3G>PVcRm(BXj`aO*0=5m?s3yymdps7a&36MnxwoR zM{rd>M>D7(beaEt+`=)$2r>MU@rV(=3=caG{JHM9WX78-X+Rub4zfH_)Ty+IvmeXp zAo=r&&ap+XV(x8-kQhYxmM8OW5QFrm1>;N)0JCCWNKRyU_AG33vFlGKXa;%-2{=n$ z+W7cAP({GryJACJVe*kdD{xsxqbZ-Vw9Qu=01NdkCvnC8=VmTMD@3tUC&%cE9vlC9 znQuGRmX9sTJ&$F)4j^KB(QIzZb0g&pf^6h5hJmF5C5X;#N`2;f!LN9w&_1a_xW8fdbvui|dlZ}cv2>;hqxPrEhcLs;Z5pN2d&@19q z`pg%c2P`T$N(QYj3u}O5q<)_p&cOP(j^kj6uOkU2g(+T3ElfKNMrp82G!! zer(xG6c;;QmyBKKbmCwVaos`Ma;g?yyCXCRLP0=KixUx(cJY%b@TdavC(eCAG7)SP zm2jzrO)RjSHb&-UhQK6%pDceB!@IdWJdUvXm`GT?Ze`rM@}ry%6K6Wr!y`nEEpmj( zu-e{qQvLI3kGf~Lr%VFz+CX5XXY1i&x-4xe8{CUdF%PX$Q3GU}JIB@SHtgMz_=Ai<{9ji(b%r-vT`FscxBWAfnvn z!YHRbH$c=xT-x{KnCb0Glk+-4(<{&rWmQ1G0PDrg_I%#C_)!!Q5xY{p38CyO&m*Ov zp?qk<)b6+##hP}-8{2p5G6Qf<#Twln%f zDrds~A|P0H8d~V@>AHP1H1L$VwDEG>Z8siz_OAAr79t>+TYbaG>$nJ{!sq-|>m@@| zhBkCBDG=m3zb#n|I=oC~9si1nIH@3edxx6T=1trtjaP5CC`me;87EVwIXjcy!K8Zc z1MdTP%abST4UWF-X8X(G?e8Vzaz7cTvXCU!E1Fj1ePPRJ1lrKxcIzKL-FsVKS#(|uK{v`Y%; zrM)|sSP*<@s0oitjK^;QsRr;RFVJ^Ac5EveYs z^-tT*=S1g`9bk@V7A2a6a^D5|;UqGwVRGcvuE#yv{$g4*a=-%{i&+W*arUJv-&6xw zkrm~*^e(vEjFxKDb^I$73F3S6ShCGdMbRw!yU2?Dk%8{UOHp$qx4*NM2mxGB;(h`S z(;+8W$)U-aIvHTZ@8t4bQFCgrd9$?R|;HU0#MiJKfMqG0DW;jKq~!x@D-r949WOP9`Xs#4o>At-p4UGJlxKVI~fwY`4Txh!|*csKKmJG%eF`W=B2Z-WTj3er%CH1EIuRt$tA!@&$cKZ!`scewgLY1 zT}6#BE%FEHN_5nWp;?EHu*Q~8Z=qKVa_*99KZzIzr6NBS-sJT8ELC?Ot<@Hrc zF-ifB;cYD>TGE#`h%6&eWjAmE8?#?vb2@rpDhBP_2pEyU3Tq6`TH-AEa-#z&W6&?~ z?eo$L|25$BwrswQ-$3!@mkWhpI}YMJVsMlXklq**27b@%vt7ae+565U@>T% zH)T`!aPFG{L3GbUjOB^qXc?D)HKY{JbjI;VMbUO2JEMaR0%*@SBfMtr7pQJRk3w}I zwzi}{cuW?~`=oO*)g!UPFVN7j+APH|l@85uI_+14&gnivRLjx`DqYEXwsv`U7cXT? zoTe=u-7nm$-^?UgFPhQwvnF~a$}x@{wC->tO|~^L=}uf;r;BMJa2yHDjB^qQavP}|t;d~AV038w`_`qs# z76^CP!gx8?I79xzCQTkQjL@Zb$>a3s z$L~rXL*-t8a;-MH{G1X^cZ;GtoE0i6$%P>De&TVpM>V}axvka6_g74)$LUTzeW&E~ zFkcSw)B9?aH(>IhVn`I2bkVi9PyCQI98~`H84^?9$)nW77p82e+;20phgIz(@S1xUg!dM9o+pW%{ z;gt#lLa>-f!9Gg!xJ5RUQ{oQ zLuciGmzJ3PPsKoGLyJwystJstoa;o4Pu2lhYRTP?cNf8k^udTa-F!J>LQ&U5q?T-# zcRk0x7Q_yQu7e_bfdMUksdayM_X^7K8yKZW!&(SI?2M&6Sfq~vBtA+O@}C$*Xc>w1 zPEcP!Hr)o@YqjZ-jC??jm?E!p2?LCwB|Fy$-jL%1s4XTAmHQ6*6Q%+NCCI{hZi>X} z1#Zay>9mv<9}0xAWXFaE+czFY(N9qGtq(vDl7W%77Nj9-sK=s3u__Qd`odoUhz~VK zu7f^Z-!1#9JxA84ETPY2-#cBzQYv(mshH#=86*u|T=)c8_xKduw&<&WRL!~ll4-z! zq3abQi(BF1r>k)p=f1fN4`-UP!9)VQGHLDkBo4wJ^z=+pC6L#a>j{z_A?mtZT5h`mf*P_eq>F8Hvdyd zK0@jS)&O`HLI(vh5Y_dWAU`WmFKq?K^`d+zYKniQA;2U^ijJ-5r~+Rs4{TE z9EE)DhAtcF&@h*K1=;IV#s751Z-c7%^SzKX6&Fc-C`E6|;wrdJ8m@ zMIWxl}DI7=Syfi2*0@*E1xw8Uyo#Y?z7yvPQlP{hxMqOT)lArGZ5o zLdCb6hh=w%km)&uSbM+~f{*^D4!$HB4%g+~r=tE$Yih)puZNMfk{+Rt5C#e>8Vn|= z3f5rs@>JoxTX^W;Bvr5^au~l|z<)4+LkoiJ500+nE9_HJy)x5Iy^o2!1vY9(K~Pxw z_&`7@(_d_%`@@a58H*(jKDjDd_f9ah+r8 zT7Bt2p(u@<1X8Q~ULYCW_j@AsjIz|3XlaIDv|hSbs_Qum<%Ga_3Q z1}&)sOGB=b0Ebokf~0`2n6CFDkI*2wYe%|rAe8M+q5Fd$N5DapK)xQ1Bnu;kTeC7j z-itY;tTkrR63J!~`QWle2sFJYO7G5CXT=mG45`a9;1?InWh)H3zRW{d;f=rCjvgFm zl0h+IoOO|o;=Ge0)eWHpJj)dO9+;w_B4u81Yp2&gpc($Fv`l}+g_!}tKS zA9ziQBlDmYrD=F{gpF^`|>Tmt@X>bO*{Xqx6tbv`t&R z{ zb!5&y!kxc>EY2t^@Vl%dnI&LQr@&;oY`qBJKzxMmv=Hcd7O@z3-=>92Y5`_#kv`p6MiMsv0U~?&g#+E#A_~gg#BoVWgyTZ)&UE4g{%(y!hnH%HvWU2%Z9hU<& zjvTDOO5ZP?mf&UF9c9f8bS|EtLHE{xsW8#CAXGUNTJ-&Ct{9Fi;v%Vbw}kT1(rP(_ zH*EiT(Ku?T0dX8~l}Y*i$;Cf)Lon5KH!PI$-y3KC8~2KEVL0)O9)ai3zRIX6aIiYC zQG}Tjn)aQG+4hV4*d3BY)r39xc*Vup^(+kxvZ~0QI@-2zfu$8%Kf@#*{2>onpmapQ z{|hq7SiYi6Mut`Xzw*auX^RVky0&Ir?OJ}4ruHC}r^n*-sN~u@vg3}eix^b%r|pS( z16hy01#_>G_2orOK zVq3G*Zt5BLe=_m@zHA*4nIv61j(lPu=pcps&VdPGSn7U$&RrtC+RwRax$p^^#mxe# z0IVyF8ahxM$Wqtf&v;&+KI{-&G+4oC=&>Q%D)rl>$7`vGwuRk8XCLRVfuQ3$@rFij z5U{FVD|({cotrakYj2su1}>{5#jiE3op^?skz4Yfgrdq$S$`cgzQ>p=Q zD$`Fqm#K#qY|(OVdx`_IvKkAnZh0e^fsU*=2=G(c5yyJWrybo(8=I{^1ebh#V_7*h zv1xJNq;^!xyyVmMs{7MNL%3Fp=tfcSIIb(dn;8#fy=BR$wvyEqciI4y_HETVuh;|Eyp)A?$3IPfWq*|gnsICN=K@0^WC#*(AVSl=D;vG z-j6wOzraH;|A0isxJ_N<)U|VHi%UXQ!7_fu6-NSf zKGOS8{M=Dt9GZ4B_Pnn19){@P^g~V%7F@!fHRo~7K4W-(^gz{lCm%)=@$KT$#x~zx zZr0XP$(#2@)K)vVZn?&ypU2NSo1?eN3q+S* zbVe^ZeTohXbG+kcQ}=Pu&b-uWy<&cGktNe^xQa`J^Qk5LI*aQoi9(dkpUvCz>QLa3~wHdDdttVmZoahz&@nWBbW=_g*CceLY`{%?=j>WF-KMcSufVN>16p95{d6LWPv$j+Tms{#Yy@I>KRSG^y_XRzD%90ueqmtET$p{%2>g-bn#ZF(&bT>ZqbacIEo(EoWpgt`mt#se8G2)#1YzL}B zoK00di{YDT_-5RpN~}N2d~_n<({PL3DYNJ_;HquMtvX-aYCRWttz5dXXFL;u9~57D z`;d`04V-36)of}`;PPNM&6QvR4_ZsMxqI#hyXg^OTMnl^HV=YkALU(ax6J>_*hu@D zr-Vh1o0U-C9Oh;nLD^R8->mX8$k}Yl8%t;<9E{4L?V^3$3BRcWj9T1|#LNDVn7r~8 zapz*-0CJKt_{Cm2XWV9b#L@iSdkUrW**UI2Q-1Eo)3lj~zM*o-ILD<4bT1bxlayJ1 zSHz(~^9xmLZSmi}D)*YF*5!yd8W2A3{Yc-?lS)s@^6&q6mHo&X;F8N3Z8-Qr2RWgo z>aUFZ3sf|68RZ1={1^162;)qbGFgREKq(tpKi>EgmfnO-u56%Fn0DH_#1lms(vhVk z+^lre@`SFyS>bN-ZzfRfjmlO&Zlh4=Jf=dm`ejg8_*IILJB}`4evEKItx!3jsPeXo zyNh3t8gm=#NX3i0Dtn{RbuKZ{ zZ>Q=n2`xQ)d4cnHw)_dqhm(`=BL_N+;EX}HIP?l#MD*{Q)Jc2@U+`_Wn(;j|BBm)^ z@iT@~Dg)Ou{{GH23AcB5xn{GKso*5n-mr-Nk!ZLWddjLhzpKVgkt_aw>N!KlT2;aP zow16~uPa-%zk)I>J+W=T`_2{>=?Hsd-xdD(-BLyDq@BrGuIIn^!>~$HjF719-|un- z4y@m>91?>Cq^5jm)#lqrg6hM=Ur{L*&(mNA%5W3Oh>m@Jlo>q7FEco^O!!eUuyft4duR_}nVaA=>o_g<8fw7L^D;0G7S?>GdkJR2s z!`wH2B8z^mv~G~TpstKN{N}}j*PKpFEj&jm^2eOS%o{hKOy0zQ1_;AyQtMcE%LY~U zgMz7c&m)#uch?EqVtw&8vHrQW>Gg_QKc~(wa$+iKS!{M*-kyEe8O9*bhDS2 z73bXK7t+D4SfYmf`dGr2e&^aT2MX$};FGgQKV5;|YW03Ao7x}5Gqb81{M8)#B{tQr z?#IFJ_|1#ht|gU*Epn*ZWw(Qws5QglsB@uAs{1+9U-5lBzCYvTb>6RY&g(p%=e(ZkH*Mo%K(FjLH+1wzJ_dXlU`+_!i!rKN zdNM@3yjHw*%fR|hwoT9v3n^+d{Z=FWs+2OK-8JjqclLYwx$rDvNg^A^xG72$U{|%~ zPUot!952xze^9&OoItQs2*NK2x}1c&q(6S-Io&I!)wU~BWfL(>wYSidNwn?=|2#vG zEeYDPgtkjV7?at^wM=WFg(H7i0V|Kb`S)49C_1kmC+D%d+p_ys`GJes$7}7L(Fk?* zJ*514OVC**9C(BalD01wu#}#8Ck6Ag+;wGrVQ#p~uOZBCrJJ|U^Q)bU?RSge>LBr1 z4>e*FCl5b1o;G-G_-WQ8V>pN~sQ1|;|HD+LV!S8`7;Y5h)*YVGz^8qTMsrwjmrEGR zn_=cir@EQPdXH*#sfyY5pPZC%_0!thAF6Crn-9J>MA~x9d}rJ1y{S4H{+)@;VyZB= z&D;0QfcpHhu_)8YqG(?p42{I4_}DcoUcBLkg>4{*(Ec~>ewV7*_fsPJ8!LsTfz$pu z7^SN0o&3EgJ7MsMfiixRw5sI1JGo)pg%*yh!yvUy6!_Jbg=A_7F>BupshWS*UI9br zokMsv>Gwp_k61YU$icVap=^}e5tEh86$e2{g1G21$GZWx;XU(_$I0C15jK9G#a`x73W;$E5vsNiiSOu(*_Rewk^9j z_)>I{fzNZX_+RqLXEVCCshwFU#gVM=sz9@=`fGLSpHzDbr>>d`Y!POwqx1IU4Qa+s z=v@7hgXoDhwh;WDeeQ54$H{+_0`Joobh4;?x3%FA{9Hao`72f4dsj!E-!cgk25Vxg znaphwjv3cIUtsb1WdWBh$THrRwXf|mMvns4YDf$m8^{H+jlm4M=yGN6=XPmIuOVbJ zRagXl24*UAjFp25KJd)7B(Xbc`w*jde}d}_Pin>w0%UF64hSm2g*!x&41JhR*5f-9 zYf>bL`MUE?1Fs_GMFB&UDn7|&=R2H{Tg)snpW2(L_u;eCzyI-l%iA+j6&!ggJLgYa z+E?i@v#z*~i`-)Gjs~rqk31?+m7uOdL;*cukrRP*1Q&W`#_Sx^Xj(oSyjryk20PYTZV3n zB^yi4^V1~g=vW>fWEIbYYv8%~2X-v~78p2HYKp#9euMZX`P|d#ogblr4UrriX$nC< zPtzFe$)ZfD4u4~~lV&g5uLCAjiC$86kaUc&)!WTP?K(K0lhAu&ber0|IGj=`xUpPw z*QYxwnWMd=WXh@Urs{koMCOtZ>H?WCJI~i}h^0qd;?=?8=v_s>iS-Q|$v2Q=?T zU9MFR@gDo6iM+P?;q1C5Lh95Re~rN|E6bw?=B0ldoK%gfS zz1$eK@~T8<_mMS+vm#3&pBjU^8rrWc4U*0=%`EQZw>2L_;FyFa=upvaJMS3qX=T_NUn19;X2|=2h zR=!}7TeJ)Y^^rFvP%LTa(9h2!D(MwJMANXitxmE3hgZe(Ivw>KLK$Kc!0Yf+EH`1C zC&%lMrjE5OahZVSAFZc^vVkWPo@lOj`8v*k`+L#1>lD z5N?*cx5s(%aKFSI(mb^8PMZIMyL4L0O0^W$Mk-9Z1xRLAMy+~GuTB0Fd1kk9cK$k! zlPg_VVyu~FD5mn5w-20i8%egiBR%4fVomq$7Np42Slw#tCNosC^B?X8HZ#3=6?4w35M-mIm<%ANX@-_?L)*C6faA5 zBwKh4ovpi8lZdrBBpB;GYUo{!-8IYXj`G)lQW?T0(X{$u90Vd%4Y4>*#Ou$XNVfFy z35+3Jbq*!iu?>A`*^aoL51YN>tu}S#a#5g>{|`;Lv}e51$t()B!!dXwmOqM8wlm6y zExIFMbGsne_uhi+^3FK74e%Boq8MCDZ~AkcS6OIOm-vMc1xywi;>JExT7Ct~nm z(tWp=`7K7BHpI^85Y$aXqL_HYAyxwbf4X6ms0?K(ig??1??8;dPj{pR=_@Ua7qM9p zFr_2Mx4PlrSK6zlm@863W6b&Q)Le--RA!cX|3+GZhL5D{i|E}ORam+AI2MGnN6{~<tMyJ%X@LLW-b<~zJ?yYyOSl2MqA18w6@Pj)hXTp8j%z3%zg-Qa+KRo!QA zwWM@*oC~lN*itoNWQa5Mxm5pJIAiG_{pGz3sO7|U4`aTD%FZo^oIEcjX6lRUsuUMB zpBP1xH~$obF8je+Ns`fSIsz9t@l*~C$M!eFCTncj^bG;G!^NG?+lSt#Lbq`%FFLI`+Z+wvgfIW)yd1&5V4TcRFRy=N zMTTDAw-)uD2L9@~(OY}qLEJE)y_q3Qx_8%s`!k(mytb;6QWLV~@a?j|MVfzrKqcT7 zf1>pJ#?nR(+ZsIDagV5`+txcoZ0%|$_qK<>6`y$Y{qxwk7{;b<-mB&&#GIwIUF)4Q zq^O5YsyjX}U>naUWx6#A#zNy>(B$z|H@6Yk&*&A0H&^$O`yM~TizEG4o(<3$cTUD${M;oY5!)(gthI7^Rn0C z-_-}nED52Mt$_=0O(3w41Pp8T58X?=Qil@t!S@-Vny(04%&KVe5#*d^FyR1+A+K4t*ssHjk`BJ^DC@J>IuEZy6`g2|uY6(5g2kQ&1X^8p6r^nb zH^DF4X~heic1q=l6C|(5zxsWB8~8r4x7qYKq4eYFnEDhg35wY%I|=(*z|-=ho!GjV zp>XhbNk0)YbT6f(_7Sf%GKqtcRPkE4bQOdkolRnN*IBE6Z=UZ*WQN>&{v=NC8VG z`h1y7M;L|HzkC%g!Odo|JLN=bDI?HE6%M>~iGP$h_OExm&lePJ;mt48^>aG`CuD8*)}4#Lg_sgVCC z1Dx?GUKB7QZ)&m?1>oRpAjsqDr<;GRMe)~iZRlz>yUwaI+-n85(_;_mJ8>BC1+uX# zWu>&=UYi=9;7^=-$Z7!(!9M3E*$JTVk2k#Hww_(wkjMXoDKVJ0F&}(P*O7>eI+?%M zG(^AIr!7zN-v8oT-v`va;&{WOu2lheq+S&(4x;{m-lHQON{h?_s#Z z_k;dcv7+}#pg-cvLlV>10oUd&-K}1^pZFP1-aPHt!GI-D%0RB;xOTNdj-|ofAo10_ z;g9i$Pzh*}fs6ECAN&&i3c9fKY)G|sLxF%1Nz;@|-T}P$EF8ZNBlQIvYG;cfa{PQKdgEU{}Om}2;mLvJD9e*+Sn>r@& zoWeH3z}51Rzi^4i9#UPZyz$9Stmtzm)I2tiwKzMCOf)J!@*Rm#x@87`YBDro^44=u z(@Odn!`E?&a@@}E- zLbdlwI(s7cz{{%&hJ($}>>6jF0R~hFv0nEI%iAn4lF1#l z3u>(~nM2xjtr=JzFFA%FfIu_;RGHiZKzn}IGvVM4*HzwsXI<^A^^sY|tMZoiD{`=)GM))S< zRy~m3h61J{PhZl>UKM@|(}d7?U011!;Teg(CZoq>!pD0H&9lQGjqWrtv{qdv`f2~$ z#+Z`J&YZt~5d!d5V0>UN0~hxQAEC6r*g!P z8YDuJg896$6kfsDZ>VDK4mudAYy)fH!0g&jM0{s*nO23DC2KHa`Iu4`d?MU_5B@eR z$y-8D^_@702kX|0xOfxlFp6vvcWaLth9Qb&jcusV(HO)A|h8^V1(SLf^Pm zub^!MdE~(ky+y5$bl)6vq_))(qF4K_8h0&?bFQ?CLscpj3Dzt_hN9}Itj&}aAoVwC zE3JiDOF|pQ1*2p1JnY?l8ug8~C*+8vDY#|^-jn=cjik|vdevV2{c)kSOOZBXHt?#= z0p<{Cw*j*OQShbT%8_bcmL@(emyUc?iYVm?`M=W5|Npv=wT=Hc>-(I|_wT4@(7%DM M_BE~Y%XXpv15Y~0(*OVf literal 0 HcmV?d00001