From c2a0396b7ffa6088e645306738336147cd702243 Mon Sep 17 00:00:00 2001 From: sys4-fr Date: Sun, 16 Sep 2018 01:44:44 +0200 Subject: [PATCH] Ajout du mod nalc_boats. --- nalc_boats/depends.txt | 1 + nalc_boats/init.lua | 350 ++++++++++++++++++ nalc_boats/textures/boats_boat_inventory.png | Bin 0 -> 1468 bytes .../textures/boats_expert_race_inventory.png | Bin 0 -> 1431 bytes .../textures/boats_expert_race_wield.png | Bin 0 -> 879 bytes nalc_boats/textures/boats_moon.png | Bin 0 -> 3603 bytes nalc_boats/textures/boats_moon_inventory.png | Bin 0 -> 1514 bytes nalc_boats/textures/boats_moon_wield.png | Bin 0 -> 1113 bytes nalc_boats/textures/boats_race_inventory.png | Bin 0 -> 1395 bytes nalc_boats/textures/boats_race_wield.png | Bin 0 -> 854 bytes nalc_boats/textures/boats_water_inventory.png | Bin 0 -> 1533 bytes nalc_boats/textures/boats_water_wield.png | Bin 0 -> 1145 bytes 12 files changed, 351 insertions(+) create mode 100644 nalc_boats/depends.txt create mode 100644 nalc_boats/init.lua create mode 100755 nalc_boats/textures/boats_boat_inventory.png create mode 100755 nalc_boats/textures/boats_expert_race_inventory.png create mode 100755 nalc_boats/textures/boats_expert_race_wield.png create mode 100755 nalc_boats/textures/boats_moon.png create mode 100755 nalc_boats/textures/boats_moon_inventory.png create mode 100755 nalc_boats/textures/boats_moon_wield.png create mode 100755 nalc_boats/textures/boats_race_inventory.png create mode 100755 nalc_boats/textures/boats_race_wield.png create mode 100755 nalc_boats/textures/boats_water_inventory.png create mode 100755 nalc_boats/textures/boats_water_wield.png diff --git a/nalc_boats/depends.txt b/nalc_boats/depends.txt new file mode 100644 index 0000000..8a4e32b --- /dev/null +++ b/nalc_boats/depends.txt @@ -0,0 +1 @@ +boats diff --git a/nalc_boats/init.lua b/nalc_boats/init.lua new file mode 100644 index 0000000..350aa23 --- /dev/null +++ b/nalc_boats/init.lua @@ -0,0 +1,350 @@ +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +local boat = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boats_boat.obj", + textures = {"default_wood.png"}, + + driver = nil, + v = 0, + last_v = 0, + removed = false +} + +-- define boats functions +function boat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + self.driver = nil + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = clicker + clicker:set_attach(self.object, "", + {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function boat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + + +function boat.get_staticdata(self) + return tostring(self.v) +end + +function boat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "nalc_boats:"..self.parameters.name) then + local leftover = inv:add_item("main", "nalc_boats:"..self.parameters.name) + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + +function boat.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + if self.driver then + local ctrl = self.driver:get_player_control() + local yaw = self.object:getyaw() + if ctrl.up then + self.v = self.v + self.parameters.controls.up or 0.1 + elseif ctrl.down then + self.v = self.v - self.parameters.controls.down or 0.1 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + end + elseif ctrl.right then + if self.v < 0 then + self.object:setyaw(yaw + (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + else + self.object:setyaw(yaw - (1 + dtime) * (0.03 * (self.parameters.controls.rotate or 1))) + end + end + end + local velo = self.object:getvelocity() + if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:setpos(self.object:getpos()) + return + end + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.v = 0 + return + end + if math.abs(self.v) > 5 then + self.v = 5 * get_sign(self.v) + end + + local p = self.object:getpos() + p.y = p.y - 0.5 + local new_velo + local new_acce = {x = 0, y = 0, z = 0} + if not is_water(p) then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:getvelocity().y + if y >= 5 then + y = 5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), y) + self.object:setpos(self.object:getpos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:getvelocity().y) < 1 then + local pos = self.object:getpos() + pos.y = math.floor(pos.y) + 0.5 + self.object:setpos(pos) + new_velo = get_velocity(self.v, self.object:getyaw(), 0) + else + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + end + end + end + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end + +local register_boat = function(parameters) + minetest.register_entity( + "nalc_boats:"..parameters.name, + { + physical = boat.physical, + collisionbox = boat.collisionbox, + visual = boat.visual, + mesh = boat.mesh, + textures = {parameters.texture or boat.textures[1]}, + parameters = parameters, + driver = boat.driver, + v = boat.v, + last_v = boat.last_v, + removed = boat.removed, + + on_rightclick = boat.on_rightclick, + on_activate = boat.on_activate, + get_staticdata = boat.get_staticdata, + on_punch = boat.on_punch, + on_step = boat.on_step + }) + + minetest.register_craftitem( + "nalc_boats:"..parameters.name, + { + description = parameters.description or "Boat", + inventory_image = "boats_"..parameters.name .. "_inventory.png", + wield_image = "boats_"..parameters.name.."_wield.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + groups = {flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + if not is_water(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + boat = minetest.add_entity(pointed_thing.under, "nalc_boats:"..parameters.name) + if boat then + if placer then + boat:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + end + return itemstack + end, + }) +end + +register_boat( + { name = "race", + texture = "default_gravel.png", + controls = + { up = 0.2, + down = 0.18, + rotate = 1 + }, + description = "Race boat" + }) + +register_boat( + { name = "expert_race", + texture = "default_desert_stone.png", + controls = + { up = 0.25, + down = 0.25, + rotate = 4 + }, + description = "Expert race boat" + }) + +register_boat( + { name = "water", + texture = "default_water.png", + controls = + { up = 0.3, + down = 0.24, + rotate = 4 + }, + description = "Water boat" + }) + +register_boat( + { name = "moon", + texture = "boats_moon.png", + controls = + { up = 0.5, + down = 0.1, + rotate = 8 + }, + description = "Moon boat" + }) + +minetest.register_craft( + { output = "nalc_boats:moon", + recipe = { + {"default:obsidian", "", "default:obsidian"}, + {"default:dirt", "default:leaves", "default:dirt"}, + }, + }) + +minetest.register_craft( + { output = "nalc_boats:expert_race", + recipe = { + {"default:desert_stone", "", "default:desert_stone"}, + {"default:desert_stone", "default:mese", "default:desert_stone"}, + }, + }) + +minetest.register_craft( + { output = "nalc_boats:race", + recipe = { + {"default:gravel", "", "default:gravel"}, + {"default:gravel", "default:steelblock", "default:gravel"}, + }, + }) + +minetest.register_craft( + { output = "nalc_boats:water", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "bucket:bucket_water", "default:glass"}, + }, + }) diff --git a/nalc_boats/textures/boats_boat_inventory.png b/nalc_boats/textures/boats_boat_inventory.png new file mode 100755 index 0000000000000000000000000000000000000000..e075663797548a1f7ebbec8703f2025de6cb6b5d GIT binary patch literal 1468 zcmV;t1w;CYP)0P(_dkny46p?qFrY z&am;pLKbRFG(=gr0OJY>32sb$Bt{oTHzdHu4Mr1VaAC9tO{IaBGBZr)b?3hCJ$~PT z7((PBpvI(4Z>PDvbH3mC|Nq~2rfl1`ZSY@yu@!(7fV%-8uU_!q1faqaf9NcoutdB$ zmi(NbXg?4I`zHaYXo{C9(p5uNv@5TBuNfMQctP56BI~1WWE~0-hTUxd+HsNsXk6N> z^2xLJR^(f?k~u~9ym&xb~P0L_8^Va#(!A}P+Kz&v(003zBleos}{)-}UyZ?zz{ z8@hm;t%EK&w7MSr{Cg82Jg_X&NmI$(Nc+}FG6&s6KPj)1kDCIhx_C{L`MOP0#=eoF zwu3P!22lc71g}&T?eu-94P_x?8_;({SVo}kAV9FdZ%2g}B{#nbQ$BxfKCTNu#JD!( zOsKA{vE4Ic#;e7gF`@|u90@`MSZMU2zU+W)=`c2&hho-5dl(QL-9Izmf{QH&iiN_w zrg3c$nV)we`#>yNi`@u-cFmczhs=2ASTT9Il;e+PEDcII3v5$^AdI1jUXuc~N)Aj+ zV1(fyFhXx)@$>Z#2!zQXTog<2!xTb%bpn2RIm|sDNbN^d#Rf+&Vd9T)1Y0pznfjFfD=pTfWo!Sy3>T!ilU z;CL~_Ec<0ADeRIIPy&!w3g^vq{r#ixX3(Oc+Mk`quD%dE! zrUK}=0W39pSS*6cdrJ8CyxM(|Brxy-1RKB-TG4ePU`zmNAXt;POpT(pbu-NRw++s)Fqx5Gm{UrSWi+B4TDXi#FI~Lu)mH_N;inGh^C|uPzBBb z`k3fCDiA~|cz%qYCQ4!pA+iXlqZOth@OLV%p`B8ty?|iIqLgT28dKiamt9oDK|md?G5?(Zrp_^-0;o#> z-X8(q6xHm@+5lXtr^Qc zl(WS&LkQ}9ntq97nC{@xd_%t9aP`Ac${UQ`<_D4h71+MsJUUU;_BeQ;IBJ50FxM2j zm-^y^C#H=(>n6-E;>f^}m zILYino4?cY#Bpq$Hnr@yz&$kRf1!jhmx2w7Ixq25q zTkL5Ey_hLU*_9JAMwM)xi8z&doHGB~wz?w#sZK$_lT&7J$33_WNmu?aSONIo0sH~k W2mL<~3`afy0000YA2=M~h?bnwN4`^vF8DRp)zP3iG*KGhvawn1cf_eNjII&`RQbbpALov>Xa>% z_BcM3C9z_&T5arE0qDrFIvm^6QQvTPvvhN$MWQ7mNSC|9^v<3roi|jfXb!3btW;4Q ztNT>jY9=6l9nriK9QUT*Q zm;Hl+)bLX`WSva8X#vbHc7{0X35;MY;o{%eLWm^AOKr;KE|Vd(7T4FHU-RUx7p-J1ACC1hV6 zPdLHEMMvXKngpZ1fQ^dIoiw1@a9yTFrh;*hvphNG45da*t7jezW4XZ^X=h^^}Me~t-Iy;&2{5pt5=68GXl0pj^FD=7pZ-ePkfT*DP zAuKYLaMSTt51#Y!`Hw)6vABzBcn`q%7~lu9aPFsCyN9cAAY!8uVp`IK9}7m#@(=*e z_CQ>%jN?|YxaJgsOJTwCzjDl$uQdWZw>i1h|5Jnq|xoE1zO~)`I zJd1ZA{dz4yf#dB84aG#-AGA?V!gC{?h!&wZ@4Yemz9zLa5EO3Dg2kn-H3nyOjmEL? zR7&ECfCXn;l6KL4rICiiBG3K-)OZXd!<=VRZWMr+DgwY9d{G6lp_KeXDIKh-0iS?= zkEVd3c4t{#)@{Ey3basRElL?59Y@qofc>n=9$7yavYWE=oWB8c4rn$W#Xi-_?@zZl z>Evz?*!#$g?X0fdo!QrN)$f&6DE-8JfSa(ZsP7mqC$0{*$@hkvT{I6l&q0M6KuvHqHPIdacqrz)Tg&=6i1Scl5pzBQ;~8$t z{k&IPLAI@IqwyvIbjsE*7cqCU=CGglf!&^DXo)fQ!eGk(UNs@D9)rV=Bqj6SgQDE{ zON)ZWa l#m*bEt-s}40R9I6{s2N?BBrL#TsHs!002ovPDHLkV1iamz$E|x literal 0 HcmV?d00001 diff --git a/nalc_boats/textures/boats_expert_race_wield.png b/nalc_boats/textures/boats_expert_race_wield.png new file mode 100755 index 0000000000000000000000000000000000000000..345dcd80be4b8f26bfdf10867d56b1fca84b2cd0 GIT binary patch literal 879 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 Z{|7}4>$(p@WZM7$002ovPDHLkV1g?3zc2s* literal 0 HcmV?d00001 diff --git a/nalc_boats/textures/boats_moon_inventory.png b/nalc_boats/textures/boats_moon_inventory.png new file mode 100755 index 0000000000000000000000000000000000000000..38d891027b664da1afdc6ebda996254096c4c0c2 GIT binary patch literal 1514 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 literal 0 HcmV?d00001 diff --git a/nalc_boats/textures/boats_race_inventory.png b/nalc_boats/textures/boats_race_inventory.png new file mode 100755 index 0000000000000000000000000000000000000000..d2b2980cbe0626e91d7422ab077fc9adf424e6b1 GIT binary patch literal 1395 zcmV-(1&sQMP)_9#i)B0aXM0H(Y*B*w zpkAb!uTW=MCk7z5)d*;B=+m%Kq!rjB+L-}21|nm4KNN0RP}lAN^}ZV?B7-dz&yxr zqp3z+0Nd_6H1C!0%%V|b0&oGAeaos5zxe40F2$PZmZVyi@EP?J#)~is9>m3 z-B*OaWjjl1E1v}6@EJ|b+Qk=|} zyYs1W7r+F~=cD$t>J|P7ESWEYKo#+a7Ff76gx8pH;iq5B3N_a7Y`rNM^ToyZMF2YO zIATr+!t(J2F{Vqg%CJ-I-6NI{?INS3~Qy2H1fue07AMU?=2WZvaf& zre0MS04lajJ^+OPTPew+c_UB(%A^rMk73Ui8jn%a4nEr!xq61mRu*9m-re6Bhm76J zfbibZm6xHw4I~}@xfB6R)yoUHQCtxK;p0_+j7fNzA?$zvB#U=j+)5MwxMT4Fi^ zeD9eOLaAOEb(Wsr-Dc91{bLFk3Rfy8r9X4PtPEE5P!YkxYzqKjk4B1M(X6OK?iB!p zA^@tOK>^Pco*Mx+!aWq?cKvW_effnmdrXGX58em3B+u>6q;V%WtLIY(t3c0fn8DLg zR0KQWp#aeX%Zr_4aZZ)RX+YK*qpFfB7Wjr zf5p6x`Gyr9JalMNq+EmdIUY=ag14yk$mDYl_F@Yb)~Isg>q;sA#y(pc@Qn=h@P`pD z$1&w^C+(6*F#w>s4GT=cvR&3_Z{Ud;2M_?@UKd3Gb?h0oA-x~1c&~(kZ!B!>4+)^` zTe-_fKbK#m7@@@C>0g#y<#I{S-t54NNyny1+ZOZf02ofiOJzrYz29jo>~J$XEP3Iu zI|jf>UCCUXV+vT;5zTE)0yE`P#@Msnsr$HP?{8a4h32_n5JJ>u@rt zIKMv%06_++d#mXY|AY{0+j)k5DkN1z-RG002ovPDHLkV1lyQ BlGgwL literal 0 HcmV?d00001 diff --git a/nalc_boats/textures/boats_race_wield.png b/nalc_boats/textures/boats_race_wield.png new file mode 100755 index 0000000000000000000000000000000000000000..385353f548fd3b7e868e72c995dd9f27cb29128b GIT binary patch literal 854 zcmV-c1F8IpP)u0_``SKXj{dc$((T62V;sbu`JHEt*nc4*Bs24m5hWj z27MGN(NpA1W`Y@XHGcc!&rjmDYXsaxP|!dcEUkdT%~`@&nzJpz8ipCHYD|aSVO=H? z%!DzFK8l&5N>?**m4KPi+{sG9oN!1p!kuWr60ioe7I+Ay0g1U`te6>9#br0{ZDPGh z#oGx;LMP!@h`*fw5&5MxgcvEj&(E&)*M5{Gjl!jm6eEP-*|@zBm0{-_><|DT7@lf-M@+ zpeBr&q>`|er3E?zOYrd6;T0*gpMU&TBSl28G^i9Fhcq587xsSivz}@$9ASDU*ehog zFV$PGW#E@zfB$6lPv3v7EsUHZm6Qr3%p5T43@C)MfWQn4=S&opMV%=ydtL2UOYqnI zU@QszV<=+IiAP}52v3A)BTqU;Ikdbd6hrwg!oq*zn%dP!h#^FI%+C`b6h?iNBZLo z4p3E3_kx~21ac%u)q6z@B;q_v~gjMoo-~F`IZz)nb+Q zwIH+wU;5G)3++n_J{Jl_5Jc!pZ6B2{>hpyrIe#<3FigiH})u( zw&@Bt1|0R@jl)f7Z1u-o#=`Yox@7I2LabS8#&~9w8JxekS(CjsMH`SZvxp>S z;P91Tbmp-xDbjqd7AK0LNEMoCNc zWfTb@5}SaD3uAC7f~Yi!XnYbvavH(tewdtDXl>;uotBx)J$gZwq-Tx#T)C;&_Kp3G zPr3}bYn(IoNR*qXPo73&@(haAC75jjbfz##Uw}M1tEy3-Ah_Cbh>0l-m<03~W6*Hf z2Lq1r-^{ke6*(?#m0koui8s8#U6|gYYkb>pQhu?xMiG&xkguLZTA4#AItI=z5` z^g&d{Nsam`Rh4Y91wPuK>N9Wzs_>39U?*=3m<4EtGU(?j_j&^78-GDOEBDa*y<6Br zU-a2(w+A^9Mn?u_lG5%efO95bu!w4}`N$Y@#Up5v8uh)Wp_E$)OA~PTi||M4NDx@Q zdK~HEBIMixqVgO#?-=$B%ILNp`msNFcH1fd^+pXH|4vcwJ^VfAtF72QX^5#K2*u~% z3)i6=lF+LULuZM@9V{VNIiXfvX)Hs|%u?dKTImQu6bNRVT2*f@Q#(!|nO{VR030Jz z=<2gW=i0mC9+}Xs0tl4cBAl&Reffv1ElrCw)sNDJCCKFVAfJUVRD#}`AQf`3xD+zk zKJe0BIQ<0}Yzcy@Af8=lgQ=}(8?{Psx$bGu}XoDvD5WZ&hT2>IB^B-tSl1juj)fM@Y zCy;w&pb;xnkG0#ORxc2M)s;bz05hedB<~WW(Rq?K57sdX?T}0!k>T*ty*Uo8o`1r5 z^4E8oCTD1@UlXMl{|QwUJh3H*C}!@m_5wNh6cjR*ARmCsm!_GYQb&t|o*$?2YN-GQ zdlD@9!ax869D$g_ce+jakC^VfLlD=n7eoo5T5DalxU=NieMpwhf|pzB24iuhkjWoW z{ZXXRq6tv}0;GsLP(h!igg%3Ge}^Xe)tmbLWoDaY&zg5bo&Zvr$tyOOgtT&)df&pJ zvjQuB@CSRK`kgaSyB|;O!x%xN6f#|;3iEIg-E8WQZi9SvGq*TSa&LO+14;XEVe^-- z+6f>kHDT~ffDad763%|y@s{FYZK=<_f!s02$uhG&zk zsRc2{;g-L#c&iAA`_X3|e_$Iq{B9yHZEl;0u8wWG%m;(k>@BTPy1S!qG!%_#%U=Qf4*>oIf7PxacbA<900000NkvXXu0mjfybRfq literal 0 HcmV?d00001 diff --git a/nalc_boats/textures/boats_water_wield.png b/nalc_boats/textures/boats_water_wield.png new file mode 100755 index 0000000000000000000000000000000000000000..b9196d9b2b16515cdbf013f847a2483ca124c83b GIT binary patch literal 1145 zcmV-<1cv*GP)Ly1vL}PfLU>&YTaFX@46*-w>SKpL;0DhvQ$zEOi3B1fiXqqB!~!0t+)qr&D3I;J4-HDhh<%HYgpX! z%l%*FCjkJK^MU8rJ5(db(<3bxg1~yNq}@zeGS9XzDC;9Cfq*fNdtw-9sR59pb3UDE zQs_Zw?R1#}cegkBFz&h9T~Vzes`UQA>AVnwfIF%NZDqgPgI9)eN2!%z7!Vn7bDnQE zoVPpv{pKwXrz6euG7r3b_4-AO1K>EIqJ$6`hM5=#dT)df5D{XGOw){;gFCHttaoAv z#HgepVbXB`_san8Zg0LVdEt0EVEK%=Gfi6%a5n%%6nDeFUsNE(h^T-lAtp*KoKBCV zG*I$_t6p{l0JXtCzqu!-ky8PCXz;4Z-gL(s8}nQcS4AW2&#&z64P{X z4COb!{WVv+9h+gMG-oP>TA{Xr(wL{2?PemWG7SOaIkgl@YeaoUN&~fK-W?ZG5?aka zS~&6g7k~89oEReGApGg`M-K1q8RNh(4wyKe3puZ72!xoZrJ(b~X5JEmWABIM zlp@nKvJ_`MEp+R6_z@2r{{CnAVG;e|i!axG+LNnMz0g{SIlc-)-3Lp7ZAZ8=41jM?{(D89b9x;Of~m$qfxkEeknkx+$mjl!Vru zZiZI59H8Wdd4TKd&oFo9&5kv9)?5i{`6OwV;sX%(+N!Y-WtQa!BLLK zh3dknfpvYl5knX-YqVA|7ascg$(-t#84t%3OD>dVbONd)<{zQJ=khn& literal 0 HcmV?d00001