From 239ca89364af85ecf320bf081efb90b6785bf388 Mon Sep 17 00:00:00 2001 From: vsoch Date: Tue, 14 Feb 2023 18:48:07 -0700 Subject: [PATCH] add example for submit and wait We should discuss the use cases for this particular example to distinguish when the user should use the FluxExecutor as opposed to a handle + jobspec + flux.job.submit Signed-off-by: vsoch --- auto_examples/auto_examples_jupyter.zip | Bin 4819 -> 9532 bytes auto_examples/auto_examples_python.zip | Bin 1893 -> 4482 bytes auto_examples/example_job_submit_wait.ipynb | 126 +++++++++++ auto_examples/example_job_submit_wait.py | 72 +++++++ auto_examples/example_job_submit_wait.py.md5 | 1 + auto_examples/example_job_submit_wait.rst | 204 ++++++++++++++++++ .../example_job_submit_wait_codeobj.pickle | Bin 0 -> 3692 bytes .../sphx_glr_example_job_submit_wait_001.png | Bin 0 -> 44654 bytes ...sphx_glr_example_job_submit_wait_thumb.png | Bin 0 -> 26677 bytes auto_examples/index.rst | 18 ++ auto_examples/sg_execution_times.rst | 10 +- examples/example_job_submit_wait.py | 72 +++++++ 12 files changed, 499 insertions(+), 4 deletions(-) create mode 100644 auto_examples/example_job_submit_wait.ipynb create mode 100644 auto_examples/example_job_submit_wait.py create mode 100644 auto_examples/example_job_submit_wait.py.md5 create mode 100644 auto_examples/example_job_submit_wait.rst create mode 100644 auto_examples/example_job_submit_wait_codeobj.pickle create mode 100644 auto_examples/images/sphx_glr_example_job_submit_wait_001.png create mode 100644 auto_examples/images/thumb/sphx_glr_example_job_submit_wait_thumb.png create mode 100644 examples/example_job_submit_wait.py diff --git a/auto_examples/auto_examples_jupyter.zip b/auto_examples/auto_examples_jupyter.zip index 9ffd7b62394524ee33c4ea00a4b6361a488d4408..4b8bd7bcf18eb7df4994b4310938ba587f78356f 100644 GIT binary patch literal 9532 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 Ne}BW@zy5|k{Rhl+;#L3v delta 62 zcmdnvby<}+z?+#xgaHIPr}}Ny7Ag{A1~MkUR*{^%6NvqVIK=|IS=m4e7=h3WNEZu% FcmVQ`4Br3% diff --git a/auto_examples/auto_examples_python.zip b/auto_examples/auto_examples_python.zip index ff0f6bed3966d017f5ba44187404494f6dc94d45..1f33f1101e72f93de50c47eac979ed1542b3d563 100644 GIT binary patch literal 4482 zcmbtY&2A&d5mxN{AOi%*!I$JzJAz>{AZI0E4FocH@WDaWHf#aetPw00LUX1`wl(Y? zclU^*7e4rsiw*4EfZ+hiBjk{C-XK77%prM!Xoi9D6TYxsA3;z;XEl?de?V_TM%3b)CZU=ixzEvRpD9nD_p#F zrRyHnR$_ipn04oTBp32k?QGq9uWhUreeAss#lpKaWhpf5fQzBi^~2+Dc|D5yvx{uC5^c0X>{?Cp?Vyuiu^AGC#^qb_Yc!rfYFwE>(X2IX z5Gt=}DXXGGIQ0Js20h@78`HLgV7m>L6E-CrK(0iTGl`&EQekWBm3P+l0cJByBn5c6 z=4}gOO;}a*CPZqu*U(%eMS4Q5j;{sInvamWF>wW7SvVp&WHGc_cl@lP50VcHWjsem z`>2dfK8mTnw^@eQNR@?5z*KWkkJu1n8=wcM34LAb5UQfc%4Uqwl)#GfdtSTs8Xk@c z!e_XdJu1bVazf>C`FKLMU!O-6F2d|2-B_p#v*QVN04e94_VRvqT#R$3-xZ(Ll5Gz< zN)|TGUvTbZ6}xC8D;+e?G!t{H>b;HusgW*oxrsR?97>hl#v&Ctbr%*;kWeEBZ3UEQTBtT?3ADruc-g3Jpp<|B zA(yJ{B?ZU40kFc4qH?a9a+m6)fZ@i1?-Y2+jYnW`Yi1smcjw056$8r0JICH*8v%Hh z*66iEVR_E^bpzNhKpI^dC9c}2uj2R`<}`PJPQ3rEn+!$ zeL@is*S9g;0n)D9BX*_^x91s$wvcMu55;KA=H=z5g&-eQImEJ79k)L*^nzuwNNsjkzg#cW%Z zM2-fCjK{kToi{d)7G+v+N>5BP8iYKW9zPy`LL<)TShOR~C1AsfQijDuMj-pi!tZ=X z1NU(JVn$-)4K@n2EO8a4nddCI-tQ$L>m>5>oR@!p@rVEX<*AH_{p27oZ!z9a#TBni zK&_+-c#<61SMy2E8cRL|v5;oYm`W8e8M;rZ9@zA;_HO5!Zm(@m>tXn8Mn^YW{NJyh z{{9w|2gP5r#$no`b7((Uv!^)R7L_kQzeUA}FD@I`f@5-J56kpO4Og$?*ip#87&4SOL!byCWE>br#PyY&zS< z74VLh&%_h6oB8GqgpC=|w{WmLihnH_*W7cXve5{k+~-=u#1cDEMwS~h%tUqx6VhhJ zH3+D6h0c3_L0i|OZK8hiB23vpFdied?LqW>;wjvHC%pQ#hFWu>!D>_sUfXQJkkHsc z_M(&7Dypk2o0(kHA+mmM{*VkIp4`TYI865CDw5Se3(Rdm!I&lr&!Xv+w@!okSkLYi z1E-wHih()i@LW%8t2eo0PDsc#D5~i&{pCiaqhD6^JNSaxhbCa^9q9yhzcidQnX^I@ z;8do$7^khnJDEp9ra+~bMx{9`M2bM9h~J3@fWL1sOWPpF0?0u^zc;4G5o?xM0Bc3PM#51Rp zYYm~v+_TIy^BW|zq!F0qICFVMK(_k^`Z*kAZqb6h`#g3h=lRHL;>-h)-~>Y49X=08 zWr6`qNwN;pRK+lC0C_p)4P+r9eUfpEdHf8{6Q)+`5*SdypcLnt&o%?DCZwxnHKFP* z56(VnG)+1_IRY4fc`!biv#3aL-K0>e6DA2^lkyA-qamB2FCm>>k*8Sq0(Pe(V~(`G zV#1h89SFuzwE^lIl4EM)YLIc~Vm{B}1l_eRwq_0w_=-ti*TzByzMLpJ6;~C?)52ap zI>@~O8^?3L&nFHJAu|OO2!3Qg_XBpya{0$qzn)vrDLNfPy;^F(9jYp`<|elj{UHve zBi@c` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_job_submit_wait.py: + + +Introductory example - Job Submit and Wait +========================================== + +To programatically create and check the status for a group +of jobs using the flux.job.FluxExecutor. + +.. GENERATED FROM PYTHON SOURCE LINES 9-17 + +.. code-block:: default + + + + import os + import concurrent.futures + from flux.job import JobspecV1 + from flux.job import JobspecV1, FluxExecutor + + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 18-23 + +Instead of directly creating a flux handle by importing flux and doing flux.Flux(), +this time we are going to use the flux.job.FluxExecutor. This will allow us to submit +jobs and then asynchronously wait for them to finish. As we did before, let's start +with a jobspec for a sleep job. We are fairly certain this will run with a return +code of 0 to indicate success. + +.. GENERATED FROM PYTHON SOURCE LINES 23-28 + +.. code-block:: default + + + jobspec = JobspecV1.from_command( + command=["sleep", "1"], num_tasks=2, num_nodes=1, cores_per_task=1 + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 29-30 + +Let's again set the working directory and current environment. + +.. GENERATED FROM PYTHON SOURCE LINES 30-33 + +.. code-block:: default + + jobspec.cwd = os.getcwd() + jobspec.environment = dict(os.environ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 34-36 + +To mix things up a bit, let's run a command that we know will fail. The false +command always returns a value of 1. This is a "bad" jobspec that will fail! + +.. GENERATED FROM PYTHON SOURCE LINES 36-38 + +.. code-block:: default + + bad_jobspec = JobspecV1.from_command(["/bin/false"]) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 39-42 + +Now we will demonstrate using the FluxExecutor (via a context) to submit both good +and bad jobs, and wait for them to finish. We call a job that is marked as completed +a "future" and can inspect error code and exceptions to see details about the results! + +.. GENERATED FROM PYTHON SOURCE LINES 42-72 + +.. code-block:: default + + + # create an executor to submit jobs + with FluxExecutor() as executor: + + # we will capture and keep each job future + futures = [] + + # submit half successful jobs + for _ in range(5): + futures.append(executor.submit(jobspec)) + print(f"submit: {id(futures[-1])} (good) jobspec") + + # and half failure jobs! + for _ in range(5): + futures.append(executor.submit(bad_jobspec)) + print(f"submit: {id(futures[-1])} (bad) jobspec") + + # We can now check on our job futures + for future in concurrent.futures.as_completed(futures): + + # There was an exception! + if future.exception() is not None: + print(f"⚠️ wait: {id(future)} Error: job raised error {future.exception()}") + + # Successful result, return code is zero + elif future.result() == 0: + print(f"🏆️ wait: {id(future)} Success") + + # Some other result + else: + print(f"❌️ wait: {id(future)} Error: job returned exit code {future.result()}") + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + submit: 140663441081680 (good) jobspec + submit: 140663441084272 (good) jobspec + submit: 140663441133824 (good) jobspec + submit: 140663441134112 (good) jobspec + submit: 140663441134400 (good) jobspec + submit: 140663441081584 (bad) jobspec + submit: 140663441135072 (bad) jobspec + submit: 140663441135408 (bad) jobspec + submit: 140663441135744 (bad) jobspec + submit: 140663441136080 (bad) jobspec + 🏆️ wait: 140663441081680 Success + 🏆️ wait: 140663441084272 Success + 🏆️ wait: 140663441133824 Success + 🏆️ wait: 140663441134112 Success + ❌️ wait: 140663441081584 Error: job returned exit code 1 + ❌️ wait: 140663441135072 Error: job returned exit code 1 + ❌️ wait: 140663441135408 Error: job returned exit code 1 + ❌️ wait: 140663441135744 Error: job returned exit code 1 + ❌️ wait: 140663441136080 Error: job returned exit code 1 + 🏆️ wait: 140663441134400 Success + + + + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** ( 0 minutes 3.621 seconds) + + +.. _sphx_glr_download_auto_examples_example_job_submit_wait.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_job_submit_wait.py ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_job_submit_wait.ipynb ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/auto_examples/example_job_submit_wait_codeobj.pickle b/auto_examples/example_job_submit_wait_codeobj.pickle new file mode 100644 index 0000000000000000000000000000000000000000..666b5ed5eaca8e5eac07ead04e244ee8990d4910 GIT binary patch literal 3692 zcmc&%yKdA#6y*`Jn|L>bgdjjjP(p!4goH#x14%)H1X4O=yxv*t$o8!KfNhXykci}t zfu0|rr=j5o_yHOu8h(L>YkTI-%sR8NlY*_ho;hdEz4y$W@!NAB-L+HIudqBChQ!MP z8mFwVo+M+Ekny9y%h(5Y>nXcgSo?I8PKjrGugB~;yZHv*EyZp`STTHD5AAJNgT-=0 z$9V_?>yt2_*#NZp3|0*4F(>tDlCh#MX24^RI$r3eDLW`EcqX%H7iUG)*;?0Z9V`W(FF(~T>mqm(8GO?3{Mvh0L z$c;t%Atj~>ZREd~Ia)wtjHDeLgSzbx6~sl6Yb`8;YX43J?rHM}^SU;K zPlc2Bwo3=y$5Qnsd6p+6g{@J$btw$ejFl!G&51$n5sv?nlf!Y+#FlNs^yj3$zCunT725w8Js0VBc5W{)<|YK~1it^vX% zKSQOx{kmmHp)2V1GHG2lpN?#!P)DG=7btJNuBJ_99+{R+QR=*=CUmzdx-zY6f{$ct z6V8z&7-6J&Y5g$ympvMLd6JMgv$>~jXXK^?>|1O!2ieh-hoX*4wkjo*8)}9%(`{Fu zP_U)+*RATKG^z&LSdT>@%>O&R%cxeWT7}q~Wv-Q#>SKx&LvBmxGkKUvPhL@pcv1PB zRsk!=i zHr}z>nOWM@#*D_ge9`K%$wi+;vWcUOU=tSQe#Pvcb|BZa1bT^CO=D{>36B*FV0kZV3|`v zu>Ah@8&|q6j~+Z4UHE9B(KI9(QSRk^;h=_Z{%ETWG&ro;y-Sh88o6VKw;owS{f_fr L?o)q7=5qTV^3!oZ literal 0 HcmV?d00001 diff --git a/auto_examples/images/sphx_glr_example_job_submit_wait_001.png b/auto_examples/images/sphx_glr_example_job_submit_wait_001.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1fd156fb6e80b3cfd1840c3824d07a356e9300 GIT binary patch literal 44654 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 D^gXc$ literal 0 HcmV?d00001 diff --git a/auto_examples/images/thumb/sphx_glr_example_job_submit_wait_thumb.png b/auto_examples/images/thumb/sphx_glr_example_job_submit_wait_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..d1854d39947e82a09fcf53e71287e8e8bab08466 GIT binary patch literal 26677 zcmeEt^;cA1xHl-$CEYo6NDPgjbPe6z-Hnuz(%mIBNJ}?L_fV2Ucc(Pyd%pMmFYdZ) z!4GE^!<@5c@8|i{6Q!ywi-k^xj(~uGB`+tXj(~ue2>gF!xAE`1%SRZQlow0hN1m%%{t7MVz$1(SE~qP(}jk|Ul=ea>_J5@ek~ z3d6T0`RRU=>P8`b2X+z2{!Ni#VsVNZ-Jxg%w0xtGIfIn&Lu$R%713o? zl*U5&jnMkRm>R(@orZy~!jeQe`(bDJke#Z|Cg;;OsNRp!f`ze|MO_I0iUel-03sDMM$rSTRUJ95!2AZ)>(36)`{pVu#W zNz`vlLSYK*dLT^b%#=pOgq0>%V>~@v?Eqg|)|-ru_{9@s1?*Ufl-<(F@44jRlx2*5 zfn5F3%jjzjr5-&kanO3vAluL9C!#$LWrL*H0~q4cWZ||SH_w-bn8T?ddcGoh&*bv{ zfuB1BJTERq1Uyzp_jd1R2zK2y<`JRjGzxlG=^H30ktES2t=$drIXe8XC+{T9^xAIE zu-Z=7uouaXKiIiEF}t3(1;+49(VhvZg8r>J1zhzwTnfh3i{}?H@4mrp3NKA%NNLGb z-kti4{Bu7yxFu`@r9}BWh5S~ondxhdH`zh z`}-_g%kx&{QsrlWh;t-5U9>xQIk0+GtXZ@+Xe-!xtdlF$#YTbK&jkf%J7rIgTo8;^ zv)pT6`Vy&ZBJ7ON+ecRW0OtTsCMd(#k_OE1ElVYbo*_D;1>9`deu3Brhq!`&mm5v2 zX}W5hbpL(Du~M@;93Q*ZA!!|nw1kTL_d`s#7n3R{R>Ju*9wa0-)#xA^rI-qIob#?v zd^j!!BYbSxcIfw0F#`W=g@+0P&Kbn6e|LMV{c~)Gnvn_z-!-g?HhM7_h>)f49%~Wo z8Ulr-Sx*8_$?~nb`k}k}ruUCv+vxR|J?wlD(J<=+5|~GDBRlPf-q!{?S7kURLtd48 z;s`jtM)!uL|7^*!Wkj=fbKX%~96tf)Gc^V%R|Czu{F9bEp?y>3cO8C~Chw^K9nHo@ z;2*#|S}MP}UYy>w-c)~+;zVPE+_+6>@^Y&?e`kj zYZvOSNR;L(=ELoM_K)*;x10(gV`dvXnm$z0ZMvEWexXvce!#J+Q;Ij`kp<_`Tj^&? zxVQ7mE`TZ8Wx~fkR!>UDO-h%-KgKOUZpeQx)2H#GLER}x^S6dX5-iaC*0Ql_8I+Co z&)0nvM|xiWvPyl6T4E_3NGR5FG*Ze;4DW5;uL!*wbWKT$?ODw@*;mARqET{&qj__PTa@A1upyEm&uiQU<6aKB&Bb( zoG-yv$%&oIikL@d)T@=!zE5Qi8SOqA${cz;QROBhgGoFC%cM28y-Tg z1e3xrV>yE8Mh0kN$rU61B_{B*eTkV8g$YeWWpO(oyCHOLZk%_OwjhLA31R?u8gOq? zu*KA&Oi(dO>}xPqe?K01zSVNJXn4E-^f)H_5b7d6+3#8J`mN^pK);Spd-E6SYT@;z zNXtd=x({!@pL!&rG)vS`xEIThu$_L(*j0KnD4t#zl4PWQK@4G2&^%aE{n%^U-Ea|0 z%my9U9q)Tcx(Y$FHsi{9)JqBd8xaRr+Wn z(!Xt#T335^QJ3%sM+rH8Pw>TAB~k6&kK*24ON0G3tvw-)#PL0n7{9OXMVU@FbXgNVCP;L!ByRwdHFb$H%LlM8%x_Vqk z%V^I(tWO==|MB;Iir~ME5AzG8Q35+$E!J_L=`!f9JDx`fk;z{Xi~A9dC6mO5>$Iga z*j7}tmoEp1F)`6~&WpgxM^L*oxCe{niw-G(j;Ko4=gAtH#k-GPG!spjK@g#K7!j{M z8m%J7-#q7L-LL_XEm@8EvP;tfP~)P83JdNo77LFJXVp~Vh9(-An7-~`iLUa-Cnm>n%rThE z+T^cIUM5Wy8R#IOj>J_O=q?y)Tn&jk@ucsq7Cf+^d}8XEg5}mvpcAyq*e$4`)B5@z zD^L(~Eh?yS`mlaZHDk}-+aHpNvb?hWHQ!9;Y&@-ct0ya%W+j+x&7N+~o==<7@*}K2 zIh7`eD1Rz8{l+46ejh?Sr-F4gi4`ynnkn>ExXTX$dKE;VQfP(v3=qLU?RwOLE)H^0A4? z$T%f)%7cG|fgJQLL7;lZzG(tZ$+G3`l8%}XHnP{?d@s{Aq6@cm!fH`($5dC=A>Q}+ z_lDT|m7N&I+d9Ugz4xBx(^(V*wUx!RzpyIx9lNm0yykSSE=BmS=ZLZKC-&qluQQ>a z%`xt?(!SOd9%C$gW0yhid7Rg8_L&fm&{0dB`Ho;N3C`QEv#>bPu7uyT9xXY_lT@?MOZqcC@j8^b~Q&c1WY3 zsEqX>cgBHcyuyqy?_3k< z`Lan z3p?!;UtBvnapf_qp4xF)`Ake7^9$5h%bz2wb3hd|Qmz`(?V79!+xn%Os!@n!pkKMP zW-KzhR?@XRRLw^2chxVb5rz5g4szM-#c^Ge-~FMYP&Rk?-ayB}S zPt7^=({bkMpZK`|VSBcRa~xwyr|_Kh$3YLdHdn1@p#^(=M}z79L4N-p6SY*2as>5| zZ4K_*1Q~>bnoGB_(TLY^lS3^r+bi00^YNx$u zD68>dfjM)wHM9Qr*KJl-^g09%R5iy{HtgwUg2`J=J-C!}Vyre+34ty)IFS+1DMiO| zW{#c-2YtJ0&T6md#AK;?P}Uf49t>Z>I?CqS@~S8kOk-nRNYbtxKK5;J9}3&2+i=_R z5jn&d#PzG(A)LvINn2@ehG6BXr!stdHB3i$NCA9VX8OtY1u1YHfwYxN{@l^4ohY{m zdKNIGxM{SHgN@t{<39Z+8~#d+s=GeVDAde5K?#3SPt?ymR}*IGFH7kh*%N1U^DM}% zB$#J4>6!`G7C;Pl{5~n_kARqZrIinB?s76BuX$rkJd3Bq$onTe87W1N5uY?!2w#z) zejJ2XtvkkjU02FpBZF@9Asf2sMb_$dznO0gCWi;Aq8d84q@XyBGXk{iSrb9;GXn#_ z?6~t_+gxDhBj<0;{Y(r06_ofm?zD091F~cC%2q3@?Ke(3OPf5H&W6(;ejRT;tjY8E z#SlM*ezS9QsVyyrhVb2_QII9Ld-4pXRnPr?SP^aiSs*F-@ekfHeMu_Pv$3<``(On} z!L(gX=AMyq!9vaEMHm$(q;Gesyw+9y)D5^v-(2MQt)AA@MB;($%v@=~G=_YR#>RC4 z(E*@~WKWO*)qnLy%dn$pWd4aInn#@Q1CgsEoy?>r#pjzittuyGjy~qh@vDa7;xKg~ zitItYJTF7Ip3g_g0(M&YeTe&fR-?A$tgA?z-?6wde39bU_LN_{O|BGdYxggUD0V2; z1Y&c`!VI}W;&>JXNt`QuR3_-hKIoxS&%Gy~AUR%N+(2Ys+f#*+hk_yxDv%0FpLk7> zg1iFYLC*#4nFF6~4>DiF_&2le;i=({Rk;IFq7xXA{&h-U%vy@;SbSZ_&?|o5rWLWH z5q^Nt=T9_vaD7e0y%21JHq?~#E$cE4{nr#28w9cPa&*8yy1M3X_lec<1a+iJ+rl#`Q!oh5onTki;Uv=N|cTdSKFXNmep^ikx*Cc_Nm(3~Tc9nvy@C0MRx zyMP;pAL^T-7q6d|w9QDe=CQD=IVP%aUADG5gpvuDGAl~INxWVZ=Ya_3$)Yqj&!>Vz zMQzaX-wTcSipEJUv~^d)yf1!)l?bG6EK0=|+9p>q{0Ng8)pII{265$aJ_{JlE{c;C zj&55zSrC$EzxqAizL$0r^oo%#6-esXSt(K?q+GT#&x)-_cxd*=#Y)5!82e4k(pEIQYVn z^=@OOND^!o-&1To*7UZ)8Sdc05o%5A7cnYm=k;;(W#nemLu;sr?O%v*qkvo1m9X zq-mvm-}#;0Zknzhqy?XaNl(=7?#ld2-SlbS>`)7}d7?>g?a)QQJn|_-qp=Jl2 zJh+xtHC)~;y;iPXvXnq~nzYl*95t}K4ktZ7?35mCwDvB_ZI2kT+W<~4B{HG&P-pGB z%H2(RP@oMbejk_bP;+UXS`l-G2(aVv6s(2BNF^nUVf)rbeOr|Yx{Q-!FB&`HCG*Ey z&028`0@|3R^`daz9#hbp4^0aL>GSsU0&f&5@Tb9XtO+T=PmR9#h#}<=lLdh7x$;K2 z^M@}Err+|n{C0J+F%#a5V>|NOxj+S)RCkiy{BIp@g4pDVz0>zg4&j4gdKw!%n8L5c zoQ;>{09MTC!o!nixjsd}#8{-%KNBmhAvG&h4-IFIAMg_LI(jzd_Xcmd2~9Wkey;lT zGiMN8fX)5|e7{Q44$~B!h+&e^bH&^g4P&sathV$@dExAdF3K%Hr?C+NQ_-dgOiwMY zsK=FsNi;2>goJCFP&yyfygTefLN^Me7Uz~>PLr0kaFS#Y@LtgHK-7~UdCF*@Z<5KJs)sy#Vt}mnP8bQOFBJ81Z%1!6$mzG1D%d!1cI!!X{t@5s5>Ch6dD5MzR zXU$~!;=;qaV7>WtU8l5!P<-xX`)6K*Pk^dNLioWt%E~<#lZfnwPy3VZLhJpJg{kmJ zoq5IiQMe`tnk_F*#PLy991=93L5aa z#d5XsKnODxB%vo!xy;MJZU{ET>-yb%+HjCPxYo^mdmB$EGcal%ooQ@~RBrc;_$PGf zpGZy`@x7<-T{?E}2s^;1do0rrJ@chFCxIhs3L0rK7L;2fz<^m6WFQ~I$w=a%|JCu9 zYA53#2WtNVFL}nwRX3kMEHK;MnCXY)h0?mGhff}EWW#2b+fiaTHp^y(0ysnA+Whr} zZI2-}fj<9`#Mc&vfIg!)+gonOtEUoJD43)~#R3wlbj79(qe%y7RJI(;v{&^BdwEt> zHAX8_twRO0bVgCJG$U>zydh7Obw~~*t-=iJ*~A@^Ewc$xD-TQb{H^6a*3KW6nwuHD z?MAZF);@AOq)uSPN%$dJiT1zapdfEi+EP-~lhPwdKMnp?S6F_OD@1WEzt52`%nkEo zjf9)I!Ydg04L1zWWbf`S#|r)l)mf$s*=gD&1ii1m5B7qvtx2u7l9#9AO-!|&R>{O> zL)A<+q20X`d-G&6Ol9(x?#(WbGmXBsV+vxPr}jZXo~cQ?z>$AzAHZ3|S}Z23mdg8E zbh2pLHo9D@@N^iOekA>5lqKQnDjLm#gqQ%Jtr+Sl1s1=y;OJ>xWTS=F?#i=}P}w!S z=e}+KuM9jS%CGwl1+Ry+p5bPuB#&9*pEf7ee_Q23)E5V`uOl1&4);3HmPqYD*1WBV z7i#Ur&WC=31^LO46&KOHBoqv(n0%ZLzKw40MV^j4 zbJAv=_8bB^&y3*`;bSyu4Zeko^h#=}SKm3Ysr11L{&Wb=P8Adu??Wm6>zBUV9T_=dDc(@W%tEv<5 zmMT*x4L)T_3vjv_I6Yr)RgUGY`FwLWGPcpsspp25kS^R10%H1VeT5`?jgk}?szE`C zRS3sQPT%+oS@qCwY0-IV1#}!h%qEE`TY68i2PMSv{uv;xrizI486XwD^PmlH7{LmM zrEnVXA;^&J=)sCN1^Fs)pl@>}4QNq>cW4^<<-8XAds^&sozm46hHvMtZRWu2q8D!O z4PL>vnD;}$jKG)T@l%eC_*&Lr4BXceFNL*+B43Wa{YBdz@&)y|P&n=@$#*ZQ#&WLh6e~a5o^pfX zEBX_z;E~G_K@^!XJ+1SyHuuek3!s)B*W=JgC_MI}DbdC#6u4!zSG z9|4hE5KJZg%7F~vRXS@c7uRjx(!2{bg8xW+mjEc--F!{(?{26T7h=Wbh>Sbd*y<(8 z^zZ5m+^*)z-BPsIA=KuR=^>e>zafC3D!PtbI=>r=nsJAV4=E-o$(y|b5oYRjXN@OsD)nIx0Gw$p?D$e=8v!WHHHBO_ zRW3#|>1@&NLaisSo@t54V~`%Th&c7Il(+>$>I)Zh=cI4<7yaXyNpI@22|l)j(&xZ z@LQ|%VKC4oYOy1}+CaKHDkBYHjePCeui6VQ&m6Sh-FxdaBLNR!#gk;UE|(df9W5Z* z$~KxaVwD$eg(h#p`~??qiw4j2MDwv_lL5H`v9_{gx{(QL4sd?XNZ23-JCUJ6xl)a* zsw#5iY|ocVX5iBRK|A8?6F{$CLh?7>V~099HFf%Hpd6FG2Aa+_)6hfDS&A(`iYywf zUDa(vMct>KmTO@EZPv&vfFp|S2F(xaYfaQRWiz}Gvc8sO$yrW=zk3Qz9#Z-9qhU&` z11bg8#ip*M0fU2nZe}cfX$i+haoyESR@ee{thzJ0HYA+bXu(y)^GqK;eq(gQAdq0F z1hA$xFOHSYqNKl3c10sR*bk*8EE{Fw^}Ziki|V57Yg07Ww(c#f#w)c`$7Zc4KYWrz zb5H-U02YM}m_$qQPi}ak8!gz@8VB5P3+91RVdl1EZ1$`~SgOQ|YXm2hne|3GZu*kH zB4?*sEpEbfrYDD{_y9ihIZZY*z1oQZ&9)sD0Yg?s-i{q2#-S+h66Txt6fb zL`9v{u~933WW0$TK`}zf1#|&Q6*TyNuyLdl5N*r#EjtwHga{Q(_3?hfKl-5UGY~5Z zW&wH_du3=;jRW}2v!hF;)e8?&!Yp9wdEdr|PMor_FidY40YVL?`^i8$bN>ic5rH}Sr+Jr$^vfW@Y%N6un z;i#fd;2cBB`wU(ViuNGA8{H1}*IyHpGajK|t&}j0`UsLejoI(T(i3wt6==fx&soN4 zP2}h-cm(q#X3;&QD<(BScQS%tJW%?`(i$0_I^IRw(u`WmNnnZhor-%v!19`}(T6<_ zG1orfGhO&-W#~ts@<8#j-lPy`SBU<8FpTZz#Z)d+K&MGh3`-#mxdazVWvlW?26Msc z>TsEuij)R5`gw(*DMCeu>^vzJPs{wq|7K0}>*L3~Z~IxyafAdm_N>MJr z8O5k6E#M-8?Y@+}ru7>)sy9|729}t~F{O>pKP3EVf~?N)|GX{#RzD}UJC~!qBSJ`q z(q{wg3@d~sap8%m^84|3_0S$mIz<>kE9|;ogaQIMEQBo`6fw#yCm2j}IpNAJd3=Op zGd>lDPsn9*rPn0h1!v(UZOfB4Y-AZPjQ4qYOuz6<=|7{gTs|1C{4CFzsOF;}i%A^L z0(c|`$p^y-WrL;!Q{hQnQ3zem&^B1k@(OS#>B`yZXVH|Eqy&ZDnt_vPa>sc{Re%S5 zt6cJS?=YRY0eOKqNB1Z@!jojBwS5;0jY>k{?*{zc#pyykFByau!ab`avv8BuAPTIY zFs0=ck%WS{U2qik6-;J@d|_&C)Y*W zV|)yoqQ#%WkM$Ow=P9hcm)<0PaShRVl=Sd+!Gu`QB{Am0U@BhS+HausAL*Cz3Z+ARW4VwnR#It zmxVTe&e+y)dz3%}ig(|!u+JQGiKS@r&W>)T4K^k&#KzbApZttoN=nLG!0p&Nq<|*s zN__VEv^SDvZ34Kb>=z&09u4c0Bi`Q|W} z&qG|48_!xe%V@?SE4plHNd#8&R~{P^Wob^J#}*{NR*zoGQO~6)V{*^OA$Wa#IWui0 zcAHk__vbF?%cIo+>qT$W+rN9$Mu1t4!0Ym*hH!6&JyA57o1^JWEG`c4wO7^O6Z-R8nGtNPWKSQ%RnAZ3`A1vz9&Xc@a5dk;ksph2Dp!2fI0dopp zi7Rh}H*0)qH@kx}g_k4fE=T14Zw(cmP>SX}`*R}d$IVMa$yvU}E&Lya$5y3zsESi_ zssr;iGEe6LU&2xYj>=zluI4-W#KTRw9e(Rv4)xX}>3IHbXu9srKPWC|e~N@I&WVqt zM4||Z;+eDNi#4=!p*wkx20E$m8e$uZ3yqq*Z%_Fdyw0K6yoJNW^L#q#bJ=EtjjL!q zMH!#$kn9P0oe|nS!c6_|kyrFd_Pns%{&FWrAZ3j8GeVV1#Vb%53=^F-;!heOw*Lt8sNp74Oks~7;COa76o%^*T1H6r(Skc{Fx1s| zy&AeY+?HZagIf1Ny?D3LD5d?UZWkN#guMT%%V!{IL-L@!VgZt}<0|1aQ@V*3V-aOg zKBA=T0y?6_hzL1G5A;^J{YWuKyDc?eOmrAO68S{u${-|1yTy14>)fP3ykA_bJ5ob~ zo9A#vDaP7qKDv5}7(xfKwY3tsLz==2eRn3p@*p}+-W=fp z!QgT}k^H{j)}r8Lu24fxkpmeZTSQ%#MDB%eZ0K5AXVAYxYLmu3cn2+X4LMAGSw?38 z8DSyvH*ubC`f=rR{^_o7lfX+iRkWdpcVt`tH7JEkTZEI-(q@jE=W7Y-8EkI;omdsj zLspiQ9qr{$V?au`Bh>$Gpm@zX}otz?(F+8B~5ZX5tgC&j;IM3eDN%YiSlO$(-zt40#af)CR z@y~ac1m|UzzB9nQgiB-p71b*~EUq{2x05j1p^DR1Ew6;C6T1z3ua*`mHULeYopz4^ zrJJ8?Kvy)*BfoDC;5LAck$2tyo0s&RqX}W~20Lw()%Dn8(_&qv%d0U~i<;I{N5{%C zh98|q4h3Su{c?h8+Iyow_T^$ypU|G{_roelq2TPHD3B0X*2@y6Dhr(qJWvk0fnxRZ z2pJ3U_4L%C3jcuisH_omy1S>omi!1dVmr0yT?f$~JQWvNC+ z!M417W3P$Wd*bJ(*-unU3yOl-y*yyBQQ7jowU-57C3&S?ZMCU%;OF>dg#b>J?K%Qk z83|Dj&#yYlafJ@ILs+)hp+nfWZmxpE={(Kr?6mjCvObr9g&60!#_B)EP3?o$WbMMA z;e;@=fvMAi03X(4fT7fU0M!#>q^8b{mObm8rG<7P9Z_#PwCG zX!3;30aJ--3E&juLc+I=Mlajp?}Nw@r4*vhxLVD$cwtuT5d`X2JDZ4CLil|$9sX#7 zdDv@#H*HaTP%n^(L#-rl~v!>-1ztqL5RxxrUb`%V`^^ZSj27@4Pq=}Uy{J5M{KHx zcR1Il3o1YAs^cqlz-qg0Y9@zyyv4hYb)M<#PxIH$@c6!F-Zx$l`t0EgpvyX;sFhj55`$lKDnR4aO5u3keQ#qrc3O``17)rf!#sUfNe9l4r?yTa z%pkyj9ih-NUCS$Io?mlDJg-01rdgmKI^a>p__gHPBfX;?%1t$fJC>>0)zd_i)u}c7 ztKR4zA|Ii1jsBj==MmfJA#Ch#OHLQIdWKyU;c-r0`_Bfyj{B#;O0;s8#5Fv%uB4wq zIY3g$%C6>*>iOLj6OPf?^^mOZ(Z=V~9PVF$qf*XnW<9R{>E<^{0`*Bt;4N)w|Dn6< zT?7n6I6?4qkgs~B6*@Qnr0KW%eBclqfJi}s|AQi@;y z``8e0IzVqbaQ$Nz$oquA4}T@&@!GtqcjZ*?oloa_qf_g=nID&T+Z`|PWsLvxS97W~ zC?WcHqGGkyB>wwVN81|fKD_~JfUN&fVt_q-nE}h~L6qNYI~we5bqru4Spa7Faz!=5 z2Zi>d%2xBNoR4B2j$iBKW`Y=MKR@w%sR^lgXO3~9$8cb5#W*r(w^H&7#Gh2DwMZze zz$9GjBo(42x3{_{jGEV6SOU(nUYE=W!40^I?z_6Tu@r>FstZTQ&evP=5&|BgB#^(w z-OYLC-8x{ROWF-3YdujUy?uF!bV8*;eccICmu9R5w|=6NPRH zqC`M__YSy?9qOP%?dP-I3F82I!)8PzJ;P-C<)YVV$!(%~ zir)&9cXMSuN+T;p9MBl+V+Uq=HSXBehA)H#smua3Hn1Rvl&AwF382%22*TuvQ>=Z* zf9wn_3<)R4l9{)+dEu#=kE^0T{02JzIooc4F)d+qSqAs6^QFhU;uwc|C~cRX@t3xv z-bR3PcJ|2H%xU2U4=@(t8!Uc$no=N{2*6f!zs{b=SnJkD$8j+lh`9ZPjfL#wWOYbp z`Csi3YPLlH#Hr`K!;MWY>sLT6&W2vH3Ak+h^B=m|cl@ZpLK+A1``eG2aB^w|KwKuK z;;+wHAv2Hm)C;wadkNH?>EzlbzS@hW2Ul1$(xoNXdmK>==skM@m1*;z6XrkTXvlT{ z4E_vgRxOhIw_0(Uez`kJml0*xXVlrRXdRs#B(0AmE8_U~an&!1F&Z&sDDf84E?6 zdFG-~rPHWx?$xe&&{KCf&2~am`5?vBgOl%!TH;OGohgd}+zb$i1Q6h09laQ9^C9WN z)rsu`&uR-Yw zNlh-azy9BM@N#4GkdTo;6e4@M-^;_HEueF~y6$(u;kVI6!Fi0JE=ZEGPmq~6VRk^$ z9+8?HfEI4`SS2agA&|f8ZcnGcoK#2sA=*IdW=t^J$5OcGI1vBV-vq5^FJ8EYwN6@& zWnZPtg|Y0PvK1s>Jm?H!t0v+8a%61}<4p+^I-$zkko8wCf-42)nUP#WC4MFyvAqYJ z&GISTS!BrUk1HT+6gT;B9=>sjX%c)XxB08{ew|~ssDt}gOVIV--hB-P_a$W9>cu$? zxhOl1fD9j^m|@U3SkrL$kZDzsImp!#tR$FJ_mjHP!LX^wPLEC3n}Xchmeu;7t4VL4 zfi|Zgsk(wtinEbAmZIALb4>70AgoiE^zB8Ph78yr10AG_Xa%3#sW06b1>HXlXpY2X zY?z$`k(uc{MYMS?F~YSDK!(Xo;cJ~ z-<#jeK$+lpcO5NpxzR=5VO!DOdM&QtwoiDf`LM!Uepfn!mDfjahAiQR@b_V)D`30S zVqn9qT_X$-p0_Z5dK0&FBd)$$JK=;QYCWOUxJ=^+XTuI;@M4Dqf#Vo57cKdg~XL=YCZThEH0vv)DY+ zwGpGyg!E2^$P|iv6iwMq3hZjmVN+0aeW|c+KjKurmSSP}ci(SpKH{i1dl8n}x}tox z`nw4<5UN;RJ#VrIZS079lL;N*l|}h4w)$^BDbF^WA78X2RdDKF{Jc9Uvbn}Ef-U&C z!?EEa?A>sFSi-)wKwhh|kEnrXzg5c2$s)TroFqWTPwT!RU;`d$PWVu$)T8VvA8B0K)9t#Nps zEAHS5r^(NPGe~5Hthf7+7qohesT-eJ?baK8(QMBXjFV9P3cZf8R?IWjlHzTX)?w!p zBaYD4T~#8uGg+7GKxT}B)`zzdF(e~o5AMZ(5*BMfh*u~whcigZx{@*U~ zB5E!Lc0}qpXZzf5&8qQ<%n(ZeiYNqSgtFG+(=zlW{Z2OWXfqZQQV_FQ_NPnVa3wKZ zY7V%e#!n&;iN}Elxu@f0SG-hZG5!4KIPFP=M#9yA#RwS zsKsPj=2%)G`~}c0MLjHsy@yt3!;muIJ%Ksx8MnRZi$~DxUfo5W<;H^dAAi@gYq!i_ z9OA60x!1B=1p!dnjYOCbCP8LGX9L`-rpacukSBElM`s0~r8H`OO8TWqr^tRi*yJI= z(K9{G<$c`~ma6%*;&>+5@^MprX-NQ3R3eNAT`S{GvB2qEC(OCy=4erUX6)^+qHG{a zv=_oy$RTyTw`tb3_9hEnXZq`H2mAWyJ-*pLUmiH&Xs8YHW9CkZ90Hs@2+-Yl={9F&TkcSYZ4H&H*d;QmtNMO}?@H`W5Fb0FP(iJS4G3QmeQ2IJ_k2U#?7=S11uTw#>KAra$OyLZahom5r8U(}Yjs`IPI| zV82g4PecbH0oq{3)r{h;`lN2*-@Y>u zdosB2(U?P&T8L3#3I#bY9+}9At9j& zQ&Iy5xe<|;TI1UjHVxFj&qK95r1JSKBAzT^c6Frqwg<^h_=cwKrBgW&QF%4s zR0|}|)E~le)-$qMK;q(yF8;VhiFhsWkqE2Y;J>qhfv987w}gU}$PNa_Q#aQ>GGb1y z!hEyP!NV!yarMz12vkD|j1`ZmY^Hw;#nG2gC;r~b+*R9sdBq*{RfWxrvysc<_P z)-4PdX|C-(^js82uS0@&kiWBc$QtVb^m$R`(Bh?&1#2kGg<~;Qm2R& z5)CbTjer0{8poV1!Hk~|PI$)AjAFeD^Keg6;whrKx*U)%(B@Px(W$W&9!rr$b~4Gp z4S^n^FCSMVN^oYT=QbcQgj|+G>|_vp@$diDmYwIj`G4DoMtmQ1!a~dTbg5His8m z{Y}~zP3Ah&_g`!5s>*BowL~ezN%aE^>=hNU;{Hk`E(6INo1-m9D=SFPBn}RD-uSY~ zr6K_1N&>T%HN-tEzxJ47R>!{7r9t>K{ocpSpXO#q<0}z0*Mfg_$RVJW)uW=l)_5y% znfg*Kf_2ta@1W;^uB3P|v>u%GW#sz{cdbp5gsYYRd!6QYF24-y=frS;#0$!-Gr}~W z&|3=M3@%u8r5WBLmNbnjhL3%L5;oTjT3}E^eHOH*3=gH{1i?hK9m8Mp7pz>zMrA~? z^Kuy$r$u@e=?b)G@nzWT4h5h-`H% zRUVuscir&%r8(zs-r3lko=G?}a>5_c9uXHbAln7X9EYK)VpMy(r_*E(iZB4*Z`$@gk4ua7XR9mell8yY3tHq41 zl|F7o{Q-=ny`Z!8+shN{Q;6GE48dQog~!A1x3nde=Lg`~a^Q?10=A*6mp^4YG9V-+ zP*IlJur_O&AgkJD->;0I-NuH=TVKV7Su`8?E3#a+QvTNAm{d9;j!)nMQ_41E1+kV| zIyq1VC19{%&`0!*oaD9u;Yv|2^W5!}OCbY!JUNaZckjV@pyZKRaUr9X?)u=!Za)Z{ z@xoPOI(eS*g~+;ZysK#7M?IY~dD_J({l4aFKwbIWGi*Kr z_#n@)kxzjI$Y=(+`)0lrzx9MLr7NY#?T=Z#SSG zGInShXz(7kHOgRv)?3btXbH;R@<)jf6efMYPa&ZIds0mt&hF$Vp|e4ck4NGjV|J{% zX!m_eCv0A;)hsv6Uw;_%I5{uKWg$sT#vsS10i7>)KSJQIN2k2(M@J}lJpo~!6#J)J zc$W(wpci8s?T_vqZH;@x_2DN;s4cx(enseLR}Q%PQd~XV(}&XH2~fh2;Z=v6@17#V z`XNS=X5BufiCy%wAfDS-Q7j;fIV-^}InO2-59d&-5|XGIO7-)6>)$T=rq9i@O$dRM=F|MirNu5XGoGuqAZWXoEzJI$#1bY-#`m^XZ}m{l5V zkm6;0iYRMyx_Rj6vL`cyYYq7VfA5*BgAxL;`l@o1&YPjZJ^SouD&wPqBJo^M=J3^j zdlNenh}}+6eR^rn7JCsQcfVg z3w}v?8-`25Z;)x*E~8^XSe`o~MJL(ha>zPuBEkpT&>Rms#$stJ>dJ3ELZ27V+Vm3E z_0x_?1N>Ca1x+qI#cTKV-%7-mEEwyRy8J3UHtJfA`NRs=K$@GRxDJ!5?Blv+N#`k> z;>FZFp>M9@zsf%Y``A~9Lw7|J+4)RLF*s{M42ZQc!Oss=@Y+%^2Qbap4;7HV+*s;< zIC2wv$Ri%fEUF?*B?t#$&y8BzeMeB=aX$bG&2E&1MYwtW2+47Fg>8-KKfTXDdg$p$ zCdkt@)0cme_x-k@SKQh1z^uvf3l-JM6fCNo1jt>G#@J+XYAcJxN*udI))W>Jc0}bn z3m9kWxwU&#)es)({TDXWlEoraM)~LBA}%Y_cWV<%Y!Z3fjsQ&r1XsOw z(_0#KA}C#rL$!s52jAKo=ik_pWla@R>q>IEM*BmjT-LBA^#KGR(|SL$X(mxl!6_*# zH&WOmUy|6YANrrGxDtMJz;N4Nh$!~3N<5-y?VPH;wzGFb`MlJ(a2-<+*jN?q2#)iw zJ!xm2pvqWokd1ukayg?(X&F_qm^U4|G`mXo)#ygfAOk{ddKxApm&+tCo1nwa0l-zE zT3hViNKuvykMy7CziueD05uRLP*ZQi<|eA_bORXvOFQShs;a281f>I3eC&u+gf64X zo@XsboQHFJwl>LEty8aQwNoo2$ct)dS=VfIaQ{x6Cj@$wm|c4Ciwc@ zi2&yuz*x%+y5WGr2#gOn2eTFtfOT~0sw_~x(|GiD0{t4GSi zLKOQ~D1tUPdqR%BoG-@Apy|8X8K`)dYFA|6YJ8+Yt;0s`BGMN-~S$f~9)} z?+}6YaU&BJ@SNj)tCGU~255e_aba!tNx&#fQ_z|5Y`@0)ZIB0%N-oKNQRSv;XbH#L z3`ra5>H=WIY(^+Wl~qyH0dF!JRR560U1^*V3XD}Lw1nCx#I&Q|DY+iwFfF>-C+p5z zf(RH=cux}q(n2}}yxqr+7=u1phFQYQfw+gr0vP@zcK())g$f~G?o*!1*zn>TF1 z6RO~-F)rP80%lrY2Vlw(XeSu^()`U}WuN*$QxBh!^M=eSyGxUwO`#d_I0a}_>OeB& z-~M}nt6zK0TUit$@d=CnHtG{;-1j43(j9mv3Q!Hbpcgik`s1C&aR>Ko29TUxu!!R9 z{n8h)pr;xRmu00!#qedM+@bkqeeJo2I?GMu7oeDKEe%9UR9DpQ^u#%VpWf?AxI41K z?r^Z{{Fxis;|QK4+<-dc%ZN2+ci?DSC6Up4yFp3IKzXA@!b!Z;IRII`X~m4IV)3o> zvF{O%9>5I8?{p354?1Vla9ypiUTgBYB+z3qTR#9Vb$%-a5+4&=h_y^47QVvr>p+sJ zD;ALY8|UlWihJgt^6s|fM+#mp2>&aHf41V()dm0j?Kd*GuijcY1MJb;Ta{(l2RwE4 z)4Pk?iLn&tP6}XN0Weyysl=y(oiDgJ=J`>4ZQ%+})Vd2xfXi!YYj^yEQM3}hlG_$7#zM0f?zDlMNI+0aS<=SAfG=J;U!egit-|&3 zydRvTx$KSb5xvG>NvZFZJdt<6-eKVL%cM`SgN?pabnZx>PW4{xy8rCB{n3!Wa#D+s zWVdTuh?7xVl|zkj^0ARKkgnKbs=aI?j{jD0)77Z-(MFQc4$|4OJ?IMNMrBr##s|bXP_iGB_ee@@_&O$ zw?M=Iyk}4s~L45-Y?@kK!aWF-52*aS)fr71>s?7ny%Q>|5^DB@eZ$t^m#T*29j1@34nAHO0--?+? zhE7p8y$=91gCwflsXR0uC+;GT*Cv|e8MH_9-X^+NDCECM9)JutlrwO7h+RwkzxK}h zE2=N-+XhO9ARsLwAdN_;ilC%O*MNjyx+I52N<})P5h-brh9QO;5g1~G0YNMsS8q~X5Kf8(px6MDKuLXg1A$8{Xq#6wPPZ$gel?<$cg)S$j zYWgQX`;~itSy-^ZIK2&v`>S^h##hWO^X+b2^w-!O?is(vxI%gCv)>}OqDSRhPpbTE zTIm$gKCWsKu^aN?Svm>>7PvF~n}{MB53~@ZKwcrO4pd(g_Exi|81QOIXve{e-$V8+`{w^K3R?|-96K!Pa`l&Cq7u<#+ zSS!5%&f0D-io&=nu4VeQ?)+k;vTxBB53w6bz}QUD2pI$7kz=m&h}bQn3?2 z_VuFbFt3)?vt`7d@!E`NFU_4)NUQhFAGV##ng`k|*fKITGah#mR?MHHE4r72e;d*H zMHbz8<*Tf?sNtt%7hcT}YJ#qrc%7L2Zm|8~_UXUD)tt}B`~?zrHyLvI{SZv!;h!xj zmz>_TGi!6UB%L#^x!iI-C%uV74JGjUWLiy7TBa@M=kYN%V2S7Z+D0ZJg&L9lIcw_< z)@9)W`fFNWLa(~9B^$pMwkg`iwk6*k>1-M_M<0}?eLeq0bRZ?Ai=z#qSOrX@duWVU zrDXd@H)|d3N+GV(2NR$jUKi}5Y5(()SE^hK^{^N@WC7N;r%m_kqZtd4$elqgELdXf zA=Dl(Js5kdV?z^InE@b3@RHus({rs^xez?+MSuzglN?cU;1d|qURtURxevJhbCgO% z9uEljN;~+A>NgaZ; zV>NLSx7rS~=#O^XBZsCmMQ2?v34%_mA^+;DqI!a3^JpIT&@k|;4Jp*RqWX`8G)4@U zmMWr`4ilt>nHSFih|sbSpVoAnhci9tth?EH(O|hTcatG?@vm;zg}urL^ul7y{w8PJ zYjfd0ehR0Lz`OyrJz0A;-GccV;CzB@S@1vVdo6rNWuVxlD(u_j%Cfn_`@s)3nm`u< zr#U^{2+)RDfjfB)Pc;rtQn^LNbmq)`2pLx0wN1?mwE#pY{pp9ja2c8I`x^ z-V;{+hhhCx2neh~p``Y^3CW&;&gP?CPlb(bgAM1!h}iAQ58P)`oZoAUFss~Aeb?Aj z9TNh$2cML$C!v208ti!gV-h=&ll_?+-KzBgjDrz*;eWRAKDUc<=e+Jo?sd$(W|r*M zk~CAs5ch&aj^{;?08&;;oS}0_3^1`_I-%yLXzrtFEcX!kP4b`oQ7I?9t+=^nTe72% z?{+pADDoT_6F=Rhi4Qw3{`mY?Ye5Pv`BL=h)RY38uodU-`yXvLkncR-iKH~`-kxc8 znm+Vf|4r4aiwwknvvb>@q#F}MC+!`a!|!chZVXNY*fWE{b9<0=FR=V`~41bk?_elr+ zc!N4!6e~_}yt@tqu9PoUYGX|wR?&7-LDryyhL8NkVhJ^O+X$t3A! z`0`N2T0>i^blhHcFnjuwNUP>EH3%oVEHy|!Jn5{1oe<%{jtyvok+st-)(Yl zU~jV5D)y0O%L<-W^Oj`VgI4S4l zj056$2}^&;yt~Gbvz%uR{Y)Q27INEs#w`xSu&!=c--(ZlIPeY>SB-QkGGU|`zEpc# zrw<#Z16CZ&YWD*rHm?h9US}IfHj~xNE9-HBs!rvM$Tj2%x6k|YVDBxh^|6$n5OcFRLC0RK)A~N|H%Ystq#16JPu`UOj(QWu=_og> z#^ct+Y})oGaJ$q6=AQ&KKQYhyl8kb605jyh;CnH5UXO%2*)T-P|3t(QFM1_-sUjmpd#k%~imG?iZq}rD)>xLcEV7+Q`d7R#f$tkl>H?ntdi7U{AL0kk>Cvzte9D?uGI z3U{rg)6%>>e^K!~EX^pH7;17As<*PTxVqNkC>gh9&l-MXkjy^j@J8vk_%JavA5dxl zXf5aqM`y0oc{x8jPKw3a?tEr}Bx10IK%jbL3k3ZD+-zVlcOij`fVz`>W@(e7#!9Y^n{+?(%Sr>)633t*qqvW-%J&I3<@2$jlrJ4O>@haVp8rwWHpC@3@sjG&Sp z(QW?Q8fRYkuZBduQ32r$Yt-YD`Wm&E-m0o@!r%e#a7xFm!apX)F4ft1yNgvBp&ei- z8uD=B>ekhk%IgHxg!og%js z6owFyE|Xf?*SBI1GUwa;cN?Xuo%q$XAal#4Y^{j{E+0JB3cla?O)cUPof7;N95BvQ zRcnB(f9Vnju$wZA zsbpCRy1>z%AUIaROiWe%#se4p!6x7FWaW(7=7Y#`?T+DLJB+(72y4h`Ive?2jE+!x z=PW8*A}At4tEAw0$nCkPHm^e|#jl_PlUOA>VHvHQj8M`DM~oee#VmCC@0sT;{w*UD zl?+&(o2_PRN~FY?LNoPs=H{}=vzS@PCQl|%%+jx!Sr=DrQ~BuA_>Tt+Vs}4P%4s<2 zKM$p%ZbS4IDYz1D!|Xkc&=>y|-1sd5+Ii*I*}#!u;_!d{E>HLpGL4A17{hDK>O0%9 z{AX^oPtrDg@LiAek-Yd%<_kB`m3ci9hs%0ccQ*|imcgua>j&8uGp?!FW+osmDV4zz z`D6h{O}B?M0+@l;$T=HI@>0gCN!GzS0Yz-shK;1r2cS0sI1Ts=ymVPUOz25S2u61U z>IvrW7^iSCt>%uT4&#T#T%JNCb_fs6<#y*l_!1^gb%Pv65o%%}J}=@C^Cg@Jfm+!! zG(OY2dHA6BPV*`EaUU?%fsoXLFxiz;_8mG(C-d&MfW2&`P{Q^XqP<#@&Owr?Nj0M< zD=c1s6#^(~^YKh9Oq16E`R})YnifcUleYPyGs}uza3Q{$OZL~B$syz8g+aOk?E%PF zaqlsA4R0Dy`;j2lgcrc=9%i9m+l<{}W(N6udWA_(xu8*CfnPJ&JyUel=Mq@f<zA77rk{%bd7F%k&-+X+g<99Ug9{GDv`m8RjD;Iw0dl-E-jHygJ_F1SB1^4?=zxMEK z#8y*UQ%0^UvmG(!`U{d?G%(xM@})1=DD*CB05!o*OO~Af=2D(IVgx`X01HiuqqZXs zTaYCwOyd(zmEs&h=$wzyS`S#tRp8$Dnwhuqw0QzsL6)-vtkhyKDZ0T$mv${mbU|3ce-aEOb!AJAn4kX?@;_skz}D1fwo2 z^;mwOC}$G!)rIiLUvAOrr4y>I4udX)|v&X&|FFHvTYzg zV!oGdIrBD7k%N6?jsISclwzzV8hUoJnQ>HP-ddiYG>PI`;L$G5Jb$LDt-XEN&-^Io zUe0oq364VUsjQC(c!Mn z#RxQ!gM%HUBk;xChi-b_9DIy7Kyw3>^2gL)a;3gBZmOt99W<%7?l~N~&J-4;z1cdH zgl>;I9GQn!j$?X8?pu+_<7;j1k@XyPJD|1KJRgf>&4QoK;*7bh_Nx!6w6bATXYiY7 z9D>r!K?02vP|T<#btD$dk*$>oQ8+t@I-AOqp>OFmd_Dw%prk=(X43ZbTZS@{S&KF= zUjktpnCr^Ab~n}%0QnM7;3+P=`Ov%3zt|NN^@EKyCI=^7!;{ro&~r6}sFOnP3#?<>9eBZ3sDWenuf2`ofiE( zFdAqgvd8|ag>n?`WOK02O=HI@Bd+`?P4R&dMys2pG=2FWj7(9;5u0>Oly7IO60)*q z0aYu{X*=%DP^++!G!e}bz#5pKM71YmXM#3;+-maNwzLXi-4QX;7Yh>GHV!L|Or@uh zA5x`IUO3}bG3oR3W(x?D`N?SW#CRPp*Hfy_OWYOPBpwLEKIEiT8u*T7T)ho{;rn02 zzy{$H6>wK7r|aSYjdkqcElAHB4C`(2wg1xD30I2h=U4mrt02X^xnPg%%5bC34&ovz zuODe%{FvPm8z4Zcl6o>qm#*^~=^3c-x>%-4d1W&zsh-Lxr56rJ%cPznQ>gAgJamEd zUItv2m${T@9oM(Iez1A1NhRPVZid$ChB&0V${O8;V+*006t2 z=16=Vl)qTNJ!v|!ZdC{FF7W2Xwftq%+)3=@AbY8^65yAEg3HuZET+>&6ZK8wig)9+ zEtfPHc>~V&g{C{agHAV}NXW5sHb-{KdU+(-O2-z$m&dLhmN`hd_^x5Zz24B^=x&Tq zQ+Hz>iz{YbroBlO&R$bOv~btPM~0tjB-aaH`hBW+V@P)hS~#&6yNWC1tk!xTR=Uw4!_ETo3 zZc90EDPsTU3kiC)S7n)>5Nop>^)B{kBLOa54ed*%%H(E(4YQkr?mv`A(quTst1p3Ad9K`E8XAieAF^J6< zrf+ez>LCaVoWXWuT9D6WxsQ|cT1#@V;$9R0kHBn2#g8Q5V&dl67&`kIYH!z>mYA4= zrS%w3=rcGsQs0E%5Y~h*b3uyLXimb-1GX z3k%Xmvxhr%d@{#JEEy{`5>;V~U{M>$P&(F_sfm1;|NZ(EUrS!F|0Ml$!Erl%ATkkf z8>SSPfji|!Xe0U`vljyp|M{4Ke?LoV%RW_;GDJP}xm*cC?nXwE*f5AwL;whd+Lj{g z%8J}eSTToGS}yB9h@64OxA`rKxk@?)nDL|;g-pXLqT2$u2X@Eu`MKFS*)Aua_^%b8 zyMLBa)AQNnAFCV1*SGoXX71M2fBO|^uXoKz86+;ey$^8ZXiZ@THNXH0TxWB^{Owi* z7hQ{V&02i0aR=V&+SR{0dz6;16G&%Z5&3?TU7cf0;hCsN?bVWK(YP~=GT0r-?=y*v; zzK7=27e4nCO}{mIpXcxCtG*8Nxw%jYQ+ST7&%pQ6+IrCa7vz+qL7jbd*_vHBJtdJq zOtkRF)u8q8y@Zu%YZKOJj#FPKqKK8}-wWifcnX!SfzQ!!P+%&C&eqQ2Yg|I7RX807 zuqj+i7UV8vIdKO8B!g4iEIARDbX9m|pcN!G|ld(2fA+JZaAhl$xC- zh1Y<`d17){xQIx|!5Ab&uDbrN(o#CihFDK`4Vz7n`Qibw#J1M@g8&Piht6= zZhg%~8LnCRd2^t_L^7qe+;OV`H!{kCh&&!~kMudiU5mG-L)DNdpo`WRHH$)n2M5SY z)1d~Be+r_>?#OiXk_8>3vi$eEIS3ZkK*8Q-zui7mT)qe9)Xws5h~=nOd*7SI*WMT3 zBk2YgE9g)5bQQGv?YFq%yfwy4Y?cI0fwgID3^ABSw|%t7aprG6bByAQiVS3Hc3{dm zDKK%=Q0LbZ&9XXlO|?pVJkl-a8;knZIMP`nt>AQ>&69RZO2V6m6ROs~Q7YrXQncXV z>5g}b>l%R;QZsN-8)=5mzZik;bhpoW%S;UE>e-ewgrx}s^6G`)>xapl3H=H61RznQ z5uU+Y$<&5{_F7K^5dn3YY$26(l#^R#lRiw@z{0DKdb>b{BzdhelX+oQE6$ZyaqO-S zWHWjB6ihEZV zHZH&CqtLy+s2vBW>!qmJ-K?*%77g^%fO4 zF`wyJo9xLQRAqHrsWg(!wu<+_3}B6vQ}WIi8kHr`c%ElStTJSD5~0u{yWM?RM0=1i zh{VVL`Wdh|Bv$fIlkuE&OiX{oNatDjpWrts!HQ_SpWx{?H~3$d1?tm_t;9tQEX>4U zMcCuy!{c92_u-qGYD5=Dr$SXlE;r8o;hofu>-O_gX!;Y#=%lP+D^;z$1UO7E_Gzlt z3^81Q-vg>g;6E8#d&|yA{fXaMiK#mj``pGdi?K3F8FU3nBsND|-AU+al^R8VT>BLk zmbAf;S|exE;h8P3TCGAHw7;r(v47kdo-|&4F_l2A4lhg=fL#_w>-w1f^)Y?o-Y>+Z zh_?VlD8D%O(C#2CywKRJ&?9tunGk#tbgycj#q~+1_hlUSHFCBk0K+ z%+JolnextWhtjF`;+Eg~q5$0d+=Kh_l)G}k`u4zoX>@@(QI{t;y??OQ#Joheuq08v z7CeJ6W4PRZv8ek$+sE~l-c0)g6Xo-Wit37ji1YJ;f#qvYQMQ#*K{3Zqg^`zM!+rke z1$nmB%Cpa_Bx3EV8cXBb&bu=jy>%qy;F5%hJfKWG2;PRV833u}^Wtm2x~79Rjav^- zK6QK?r3REnq~?mOlB(jIqifU`)a72I4dsvoZ9(oxpAUa`Hqa=< zgn`M&vJ4PM9K*FU{Ms&n5EC7&7^mP92YRy^G?$xdg;DHE`GDR^Z%xq(Um zqRhfL(C3QNT5%Up!BT^5IduApikg@nO#Sg8v;K|2$NN zgr`PZb)ENLjs7us%`hFlt98o<{O2!j#i>E0U9M_I>)Rw9nm0gj^6(dk;q%G~HZk2O zE2A9J*MWbI;AP~cAN|3=!q<$h-&_WqJqpsXaQul~FK-KCBs+NXbcuo;S^u=<`KRjW$s|3Yr zU47Pr?bv=FS4|+G$GT;Vs^Pzx4|YWPPp2`<^d5*W6czk8|_?ePGGRqUS* z->6s1JGQn*x-H;q4~j+2{@ +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_job_submit_wait_thumb.png + :alt: Introductory example - Job Submit and Wait + + :ref:`sphx_glr_auto_examples_example_job_submit_wait.py` + +.. raw:: html + +
Introductory example - Job Submit and Wait
+
+ + .. raw:: html @@ -49,6 +66,7 @@ of using the Flux Python API. :hidden: /auto_examples/example_job_submit_api + /auto_examples/example_job_submit_wait .. only:: html diff --git a/auto_examples/sg_execution_times.rst b/auto_examples/sg_execution_times.rst index 57290d63..53480639 100644 --- a/auto_examples/sg_execution_times.rst +++ b/auto_examples/sg_execution_times.rst @@ -5,8 +5,10 @@ Computation times ================= -**00:00.770** total execution time for **auto_examples** files: +**00:03.621** total execution time for **auto_examples** files: -+-----------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_example_job_submit_api.py` (``example_job_submit_api.py``) | 00:00.770 | 0.0 MB | -+-----------------------------------------------------------------------------------------+-----------+--------+ ++-------------------------------------------------------------------------------------------+-----------+--------+ +| :ref:`sphx_glr_auto_examples_example_job_submit_wait.py` (``example_job_submit_wait.py``) | 00:03.621 | 0.0 MB | ++-------------------------------------------------------------------------------------------+-----------+--------+ +| :ref:`sphx_glr_auto_examples_example_job_submit_api.py` (``example_job_submit_api.py``) | 00:00.000 | 0.0 MB | ++-------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/examples/example_job_submit_wait.py b/examples/example_job_submit_wait.py new file mode 100644 index 00000000..c5766911 --- /dev/null +++ b/examples/example_job_submit_wait.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +""" +Introductory example - Job Submit and Wait +========================================== + +To programatically create and check the status for a group +of jobs using the flux.job.FluxExecutor. +""" + + +import os +import concurrent.futures +from flux.job import JobspecV1 +from flux.job import JobspecV1, FluxExecutor + + +#%% +# Instead of directly creating a flux handle by importing flux and doing flux.Flux(), +# this time we are going to use the flux.job.FluxExecutor. This will allow us to submit +# jobs and then asynchronously wait for them to finish. As we did before, let's start +# with a jobspec for a sleep job. We are fairly certain this will run with a return +# code of 0 to indicate success. + +jobspec = JobspecV1.from_command( + command=["sleep", "1"], num_tasks=2, num_nodes=1, cores_per_task=1 +) + +#%% +# Let's again set the working directory and current environment. +jobspec.cwd = os.getcwd() +jobspec.environment = dict(os.environ) + +#%% +# To mix things up a bit, let's run a command that we know will fail. The false +# command always returns a value of 1. This is a "bad" jobspec that will fail! +bad_jobspec = JobspecV1.from_command(["/bin/false"]) + +#%% +# Now we will demonstrate using the FluxExecutor (via a context) to submit both good +# and bad jobs, and wait for them to finish. We call a job that is marked as completed +# a "future" and can inspect error code and exceptions to see details about the results! + +# create an executor to submit jobs +with FluxExecutor() as executor: + + # we will capture and keep each job future + futures = [] + + # submit half successful jobs + for _ in range(5): + futures.append(executor.submit(jobspec)) + print(f"submit: {id(futures[-1])} (good) jobspec") + + # and half failure jobs! + for _ in range(5): + futures.append(executor.submit(bad_jobspec)) + print(f"submit: {id(futures[-1])} (bad) jobspec") + + # We can now check on our job futures + for future in concurrent.futures.as_completed(futures): + + # There was an exception! + if future.exception() is not None: + print(f"⚠️ wait: {id(future)} Error: job raised error {future.exception()}") + + # Successful result, return code is zero + elif future.result() == 0: + print(f"🏆️ wait: {id(future)} Success") + + # Some other result + else: + print(f"❌️ wait: {id(future)} Error: job returned exit code {future.result()}") \ No newline at end of file