From 6e3f9d4c111bebfed6d1876a27a4980b979fb2ba Mon Sep 17 00:00:00 2001 From: cheapie Date: Mon, 27 May 2019 18:28:00 -0500 Subject: [PATCH] Add receivers, insulated digilines, and vertical digilines --- README | 14 + button.lua | 67 ++-- conductors.lua | 455 +++++++++++++++++++++++++- depends.txt | 1 + init.lua | 3 +- internal.lua | 44 +++ textures/digistuff_digiline_full.png | Bin 0 -> 1927 bytes textures/digistuff_insulated_edge.png | Bin 0 -> 1210 bytes textures/digistuff_insulated_full.png | Bin 0 -> 1185 bytes 9 files changed, 551 insertions(+), 33 deletions(-) create mode 100644 internal.lua create mode 100644 textures/digistuff_digiline_full.png create mode 100644 textures/digistuff_insulated_edge.png create mode 100644 textures/digistuff_insulated_full.png diff --git a/README b/README index 8247ce7..0212160 100644 --- a/README +++ b/README @@ -23,6 +23,12 @@ How to use digimese: It conducts digilines signals (like digilines) in all directions (like mese). That's about it, really. +How to use vertical/insulated digilines: +These work exactly like the mesecons equivalents, that is: +Vertical digilines will automatically connect to other vertical digilines directly above or below them, and form "plates" on each end of the stack. Signals can only be conducted into or out of the stack at these "plates". +Insulated digilines conduct like regular digilines, but only into/out of the ends of the "wire". + + How to use the digilines player detector: Set a channel and radius (radius must be a number >0 and <10 - anything invalid will be ignored and "6" used instead). Every second while a player is within the radius, a table listing the players in range will be sent via digilines on the chosen channel. @@ -39,3 +45,11 @@ Send a digilines signal with the URL you want to download. The HTTPRequestResult How to use the camera: Set the channel, distance, and radius. The camera will search for a node "distance" meters away and up to 10m down. Every second while a player is within "radius" meters of that point, a table listing the players in range will be sent via digilines on the chosen channel. + + +How to use the dimmable lights: +After setting the channel, send a number from 0 to 14 to set the light level. + +How to use the junction box: +These are just plain digilines conductors (like digimese) but can skip over one node to another junction box or certain other nodes. +As in, [digiline][junction box][dirt][junction box][digiline] will work to transmit signals "through" the dirt. diff --git a/button.lua b/button.lua index 76022f6..dc2cf3b 100644 --- a/button.lua +++ b/button.lua @@ -1,9 +1,22 @@ digistuff.button_turnoff = function (pos) local node = minetest.get_node(pos) - if node.name=="digistuff:button_on" then --has not been dug - minetest.swap_node(pos, {name = "digistuff:button_off", param2=node.param2}) - if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_pop", {pos=pos}) end - end + minetest.swap_node(pos, {name = "digistuff:button_off", param2=node.param2}) + if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_pop", {pos=pos}) end +end + +digistuff.button_get_rules = function(node) + local rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 1,z = 0}, + {x = 0,y = -1,z = 0}, + {x = 0,y = 0,z = 1}, + {x = 0,y = 0,z = -1}, + {x = 0,y = 0,z = 2}, + } + local dir = minetest.facedir_to_dir(node.param2) + rules = digistuff.rotate_rules(rules,dir) + return rules end minetest.register_node("digistuff:button", { @@ -34,23 +47,28 @@ minetest.register_node("digistuff:button", { }, digiline = { - receptor = {} + receptor = {}, + wire = { + rules = digistuff.button_get_rules, + }, }, - groups = {dig_immediate=2}, + groups = {dig_immediate = 2,digiline_receiver = 1,}, description = "Digilines Button", on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec","size[8,4;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;msg;Message;${msg}]button_exit[2.25,3;3,1;submit;Save]") end, + after_place_node = digistuff.place_receiver, + after_destruct = digistuff.remove_receiver, on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) - if fields.channel and fields.msg and fields.channel ~= "" and fields.msg ~= "" then + if fields.channel and fields.channel ~= "" then meta:set_string("channel",fields.channel) meta:set_string("msg",fields.msg) meta:set_string("formspec","") minetest.swap_node(pos, {name = "digistuff:button_off", param2=minetest.get_node(pos).param2}) else - minetest.chat_send_player(sender:get_player_name(),"Channel and message must both be set!") + minetest.chat_send_player(sender:get_player_name(),"Please set a channel!") end end, sounds = default and default.node_sound_stone_defaults(), @@ -84,17 +102,21 @@ minetest.register_node("digistuff:button_off", { }, digiline = { - receptor = {} + receptor = {}, + wire = { + rules = digistuff.button_get_rules, + }, }, - groups = {dig_immediate=2, not_in_creative_inventory=1}, + groups = {dig_immediate = 2,not_in_creative_inventory = 1,digiline_receiver = 1,}, drop = "digistuff:button", + after_destruct = digistuff.remove_receiver, description = "Digilines Button (off state - you hacker you!)", on_rightclick = function (pos, node, clicker) local meta = minetest.get_meta(pos) - digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) + digiline:receptor_send(pos, digistuff.button_get_rules(node), meta:get_string("channel"), meta:get_string("msg")) minetest.swap_node(pos, {name = "digistuff:button_on", param2=node.param2}) if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_push", {pos=pos}) end - minetest.after(0.5, digistuff.button_turnoff, pos) + minetest.get_node_timer(pos):start(0.25) end, sounds = default and default.node_sound_stone_defaults(), }) @@ -128,28 +150,25 @@ minetest.register_node("digistuff:button_on", { }, digiline = { - receptor = {} + receptor = {}, + wire = { + rules = digistuff.button_get_rules, + }, }, - groups = {dig_immediate=2, not_in_creative_inventory=1}, + on_timer = digistuff.button_turnoff, + groups = {dig_immediate = 2,not_in_creative_inventory = 1,digiline_receiver = 1,}, drop = 'digistuff:button', + after_destruct = digistuff.remove_receiver, on_rightclick = function (pos, node, clicker) local meta = minetest.get_meta(pos) - digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) + digiline:receptor_send(pos, digistuff.button_get_rules(node), meta:get_string("channel"), meta:get_string("msg")) if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_push", {pos=pos}) end + minetest.get_node_timer(pos):start(0.25) end, description = "Digilines Button (on state - you hacker you!)", sounds = default and default.node_sound_stone_defaults(), }) -minetest.register_craft({ - output = "digistuff:digimese", - recipe = { - {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"}, - {"digilines:wire_std_00000000","default:mese","digilines:wire_std_00000000"}, - {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"} - } -}) - minetest.register_craft({ output = "digistuff:button", recipe = { diff --git a/conductors.lua b/conductors.lua index 77229e2..dfc8793 100644 --- a/conductors.lua +++ b/conductors.lua @@ -1,3 +1,59 @@ +digistuff.remove_receiver = function(pos,node) + local dir = minetest.facedir_to_dir(node.param2) + local rpos = vector.add(pos,vector.multiply(dir,2)) + local rnode = minetest.get_node(rpos) + if rnode.name == "digistuff:receiver" then + rnode.name = "digilines:wire_std_00000000" + minetest.remove_node(rpos) + minetest.place_node(rpos,rnode) + end +end + +digistuff.place_receiver = function(pos) + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + if dir.y == 0 then + local nodebehind = minetest.get_node(vector.add(pos,dir)) + if nodebehind.name == "digistuff:digimese" then return end + local rpos = vector.add(pos,vector.multiply(dir,2)) + local rnode = minetest.get_node(rpos) + if string.find(rnode.name,"^digilines:wire_std_") then + minetest.remove_node(rpos) + local newrnode = {pos = rpos,name = "digistuff:receiver",param2 = node.param2,} + minetest.set_node(rpos,newrnode) + digilines.update_autoconnect(rpos) + end + end +end + +local old_update_autoconnect = digilines.update_autoconnect + +digilines.update_autoconnect = function(pos,secondcall) + if not secondcall then + local node = minetest.get_node(pos) + if string.find(node.name,"^digilines:wire_std_") then + local checkdirs = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = 1}, + {x = 0,y = 0,z = -1}, + } + local found = false + for _,i in ipairs(checkdirs) do + if not found then + local checkpos = vector.add(pos,vector.multiply(i,2)) + local group = minetest.get_item_group(minetest.get_node(checkpos).name,"digiline_receiver") + if group and group > 0 then + digistuff.place_receiver(checkpos) + if minetest.get_node(pos).name == "digistuff:receiver" then found = true end + end + end + end + end + end + old_update_autoconnect(pos,secondcall) +end + minetest.register_node("digistuff:digimese", { description = "Digimese", tiles = {"digistuff_digimese.png"}, @@ -22,14 +78,14 @@ minetest.register_node("digistuff:junctionbox", { paramtype2 = "facedir", groups = {cracky = 3}, is_ground_content = false, - paramtype = "light", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.1,-0.15,0.35,0.1,0.15,0.5}, - } - }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.1,-0.15,0.35,0.1,0.15,0.5}, + } + }, sounds = default and default.node_sound_stone_defaults(), digiline = { receptor = {}, @@ -52,6 +108,330 @@ minetest.register_node("digistuff:junctionbox", { }, }) +digistuff.receiver_get_rules = function(node) + local rules = { + {x = 0,y = 0,z = -2}, + {x = 0,y = 0,z = 1}, + } + return digistuff.rotate_rules(rules,minetest.facedir_to_dir(node.param2)) +end + +minetest.register_node("digistuff:receiver", { + description = "Digilines Receiver (you hacker you!)", + tiles = {"digistuff_digiline_full.png"}, + paramtype = "light", + groups = {dig_immediate = 3,not_in_creative_inventory = 1,}, + drop = "digilines:wire_std_00000000", + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.05,-0.05,-1.49,0.05,0.05,-0.5}, + {-0.2,-0.2,-0.5,0.2,0.2,-0.4}, + {-0.0625,-0.5,-0.5,0.0625,-0.2,-0.4}, + {-0.0625,-0.5,-0.4,0.0625,-0.4375,0.5}, + }, + }, + digiline = { + receptor = {}, + wire = { + rules = digistuff.receiver_get_rules, + }, + }, +}) + +digistuff.vertical_autoconnect = function(pos) + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name,"vertical_digiline") == 0 then return end + local uppos = vector.add(pos,vector.new(0,1,0)) + local dnpos = vector.add(pos,vector.new(0,-1,0)) + local upnode = minetest.get_node(uppos) + local dnnode = minetest.get_node(dnpos) + local shouldbe = "digistuff:vertical_bottom" + if minetest.get_item_group(dnnode.name,"vertical_digiline") > 0 then + if minetest.get_item_group(upnode.name,"vertical_digiline") > 0 then + shouldbe = "digistuff:vertical_middle" + else + shouldbe = "digistuff:vertical_top" + end + end + if shouldbe ~= node.name or upnode.name == "digistuff:vertical_bottom" or dnnode.name == "digistuff:vertical_top" then + node.name = shouldbe + minetest.set_node(pos,node) + digilines.update_autoconnect(pos) + digistuff.vertical_autoconnect(uppos) + digistuff.vertical_autoconnect(dnpos) + end +end + +digistuff.vertical_remove = function(pos) + local uppos = vector.add(pos,vector.new(0,1,0)) + local dnpos = vector.add(pos,vector.new(0,-1,0)) + digistuff.vertical_autoconnect(uppos) + digistuff.vertical_autoconnect(dnpos) +end + +minetest.register_node("digistuff:vertical_bottom", { + description = "Vertical Digiline", + tiles = {"digistuff_digiline_full.png"}, + paramtype = "light", + groups = {dig_immediate = 3,vertical_digiline = 1,}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.5,0.5,-0.4375,0.5}, + {-0.05,-0.4375,-0.05,0.05,0.5,0.05}, + }, + }, + after_place_node = digistuff.vertical_autoconnect, + after_destruct = digistuff.vertical_remove, + digiline = { + receptor = {}, + wire = { + rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = 1}, + {x = 0,y = 0,z = -1}, + {x = 0,y = 1,z = 0}, + {x = 0,y = 2,z = 0}, + }, + }, + }, +}) + +minetest.register_node("digistuff:vertical_middle", { + description = "Vertical Digiline (middle - you hacker you!)", + tiles = {"digistuff_digiline_full.png"}, + paramtype = "light", + groups = {dig_immediate = 3,not_in_creative_inventory = 1,vertical_digiline = 1,}, + drop = "digistuff:vertical_bottom", + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.05,-0.5,-0.05,0.05,0.5,0.05}, + }, + }, + after_place_node = digistuff.vertical_autoconnect, + after_destruct = digistuff.vertical_remove, + digiline = { + receptor = {}, + wire = { + rules = { + {x = 0,y = 1,z = 0}, + {x = 0,y = -1,z = 0}, + }, + }, + }, +}) + +minetest.register_node("digistuff:vertical_top", { + description = "Vertical Digiline (top - you hacker you!)", + tiles = {"digistuff_digiline_full.png"}, + paramtype = "light", + groups = {dig_immediate = 3,not_in_creative_inventory = 1,vertical_digiline = 1,}, + drop = "digistuff:vertical_bottom", + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.5,0.5,-0.4375,0.5}, + }, + }, + after_place_node = digistuff.vertical_autoconnect, + after_destruct = digistuff.vertical_remove, + digiline = { + receptor = {}, + wire = { + rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = 1}, + {x = 0,y = 0,z = -1}, + {x = 0,y = -1,z = 0}, + }, + }, + }, +}) + +minetest.register_node("digistuff:insulated_straight", { + description = "Insulated Digiline (straight)", + tiles = { + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + }, + paramtype = "light", + paramtype2 = "facedir", + on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple, + groups = {dig_immediate = 3,}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.1,0.5,-0.4,0.1}, + }, + }, + after_place_node = digilines.update_autoconnect, + after_destruct = digilines.update_autoconnect, + digiline = { + receptor = {}, + wire = { + rules = function(node) + local rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + } + return digistuff.rotate_rules(rules,minetest.facedir_to_dir(node.param2)) + end, + }, + }, +}) + +minetest.register_node("digistuff:insulated_tjunction", { + description = "Insulated Digiline (T junction)", + tiles = { + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + }, + paramtype = "light", + paramtype2 = "facedir", + on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple, + groups = {dig_immediate = 3,}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.1,0.5,-0.4,0.1}, + {-0.1,-0.5,-0.5,0.1,-0.4,-0.1}, + }, + }, + after_place_node = digilines.update_autoconnect, + after_destruct = digilines.update_autoconnect, + digiline = { + receptor = {}, + wire = { + rules = function(node) + local rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = -1}, + } + return digistuff.rotate_rules(rules,minetest.facedir_to_dir(node.param2)) + end, + }, + }, +}) + +minetest.register_node("digistuff:insulated_corner", { + description = "Insulated Digiline (corner)", + tiles = { + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + }, + paramtype = "light", + paramtype2 = "facedir", + on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple, + groups = {dig_immediate = 3,}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.1,-0.5,-0.5,0.1,-0.4,0.1}, + {-0.5,-0.5,-0.1,0.1,-0.4,0.1}, + }, + }, + after_place_node = digilines.update_autoconnect, + after_destruct = digilines.update_autoconnect, + digiline = { + receptor = {}, + wire = { + rules = function(node) + local rules = { + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = -1}, + } + return digistuff.rotate_rules(rules,minetest.facedir_to_dir(node.param2)) + end, + }, + }, +}) + +minetest.register_node("digistuff:insulated_fourway", { + description = "Insulated Digiline (four-way junction)", + tiles = { + "digistuff_insulated_full.png", + "digistuff_insulated_full.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_edge.png", + "digistuff_insulated_edge.png", + }, + paramtype = "light", + groups = {dig_immediate = 3,}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.1,0.5,-0.4,0.1}, + {-0.1,-0.5,-0.5,0.1,-0.4,-0.1}, + {-0.1,-0.5,0.1,0.1,-0.4,0.5}, + }, + }, + after_place_node = digilines.update_autoconnect, + after_destruct = digilines.update_autoconnect, + digiline = { + receptor = {}, + wire = { + rules = { + {x = 1,y = 0,z = 0}, + {x = -1,y = 0,z = 0}, + {x = 0,y = 0,z = -1}, + {x = 0,y = 0,z = 1}, + }, + }, + }, +}) + +minetest.register_craft({ + output = "digistuff:digimese", + recipe = { + {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"}, + {"digilines:wire_std_00000000","default:mese","digilines:wire_std_00000000"}, + {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"} + } +}) + minetest.register_craft({ output = "digistuff:junctionbox", recipe = { @@ -60,3 +440,62 @@ minetest.register_craft({ {"homedecor:plastic_sheeting","digilines:wire_std_00000000","homedecor:plastic_sheeting",}, } }) + +if minetest.get_modpath("mesecons_materials") then + minetest.register_craft({ + output = "digistuff:insulated_straight 3", + recipe = { + {"mesecons_materials:fiber","mesecons_materials:fiber","mesecons_materials:fiber",}, + {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000",}, + {"mesecons_materials:fiber","mesecons_materials:fiber","mesecons_materials:fiber",}, + } + }) +end + +minetest.register_craft({ + output = "digistuff:vertical_bottom 3", + recipe = { + {"digilines:wire_std_00000000",}, + {"digilines:wire_std_00000000",}, + {"digilines:wire_std_00000000",}, + } +}) + +minetest.register_craft({ + output = "digistuff:insulated_corner 3", + recipe = { + {"digistuff:insulated_straight","digistuff:insulated_straight",}, + {"","digistuff:insulated_straight",}, + } +}) + +minetest.register_craft({ + output = "digistuff:insulated_tjunction 4", + recipe = { + {"digistuff:insulated_straight","digistuff:insulated_straight","digistuff:insulated_straight",}, + {"","digistuff:insulated_straight","",}, + } +}) + +minetest.register_craft({ + output = "digistuff:insulated_fourway 5", + recipe = { + {"","digistuff:insulated_straight","",}, + {"digistuff:insulated_straight","digistuff:insulated_straight","digistuff:insulated_straight",}, + {"","digistuff:insulated_straight","",}, + } +}) + +for _,item in ipairs({"digistuff:insulated_corner","digistuff:insulated_tjunction","digistuff:insulated_fourway",}) do + minetest.register_craft({ + output = "digistuff:insulated_straight", + type = "shapeless", + recipe = {item}, + }) +end + +minetest.register_craft({ + output = "digilines:wire_std_00000000", + type = "shapeless", + recipe = {"digistuff:vertical_bottom"}, +}) diff --git a/depends.txt b/depends.txt index cfb8465..a3bfdda 100644 --- a/depends.txt +++ b/depends.txt @@ -2,3 +2,4 @@ default? digilines mesecons? mesecons_mvps? +screwdriver? diff --git a/init.lua b/init.lua index 1deefe1..dcf5e29 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,8 @@ digistuff = {} local components = { + "internal", + "conductors", "touchscreen", "light", "noteblock", @@ -9,7 +11,6 @@ local components = { "panel", "piezo", "detector", - "conductors", "piston", } for _,name in ipairs(components) do diff --git a/internal.lua b/internal.lua new file mode 100644 index 0000000..494a206 --- /dev/null +++ b/internal.lua @@ -0,0 +1,44 @@ +digistuff.rotate_rules = function(rulesin,dir) + local rules = {} + for k,v in ipairs(rulesin) do rules[k] = v end + if dir.z > 0 then + return rules + elseif dir.z < 0 then + for _,i in ipairs(rules) do + i.x = -i.x + i.z = -i.z + end + return rules + elseif dir.x > 0 then + for _,i in ipairs(rules) do + local z = i.x + i.x = i.z + i.z = -z + end + return rules + elseif dir.x < 0 then + for _,i in ipairs(rules) do + local z = i.x + i.x = -i.z + i.z = z + end + return rules + elseif dir.y > 0 then + for _,i in ipairs(rules) do + local z = i.y + i.y = i.z + i.z = z + end + return rules + elseif dir.y < 0 then + for _,i in ipairs(rules) do + local z = i.y + i.y = -i.z + i.z = -z + end + return rules + else + minetest.log("warning",string.format("digistuff.rotate_rules() called with invalid direction %s,%s,%s",dir.x,dir.y,dir.z)) + return {} + end +end diff --git a/textures/digistuff_digiline_full.png b/textures/digistuff_digiline_full.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5ce21849be626c8c3998a1ce541e3e7aff5c54 GIT binary patch literal 1927 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 Y0Pv^_OV zaB^>EX>4U6ba`-PAZ2)IW&i+q+SONWlIti8{I65&5s<{^aWEfMdxJgxHkfe|znOVE zj%%x)sn}SC7Vd78gxWuUclry5xERU05PkCA;IPRi$>>D0AN!S!o#%C9J~}UPIvxl@ zimUFozOC^Yarc-I?22!%aSCPO#0B($ya07%7IfCQxPVmlIInw3YhJcbud_ZHCd4uL zd~XBDs189DlBTQ%=P^+fE6}7FSBJA`kP!*!EAGabKj)5)?uopkcjC_E71viP$oMtD zpEz1^cAs-M89J%}z0n>0tfU^d$hu{nNtOQ+6?an4vWyWKg|1ptbW+hH-RP{4Rr$DU0P z3C!RzLZ6J4i(1*B06Qm@sY4r84{@T5+?W%1juj_+7^MY5IQ7^nacm%nWvzpMf{pM{ zcIqrS=e!Fpy5zD~Z@u&02R~|54jOE5!G{oHNFhg!HoE9zh%u&^lO#n6bIGSbDW;Ti zM$!!EjM*6@a^7Uq&2DbO^;I=KDfhiiU9JQRb1wz0U*hjtI;zSWJK{gH0+m2xzsyF)n| z(kfahd?KpFY320Uk?8#eyLqnmz=ynNIC$bjcObW05Z9^FzyfJavi z_y?4cs|Gx0qMLq<7`oxdh+iwZX25eEx}}EfUq^5J2kAA@zrt&8YZx$J5dZ)H24YJ` zL;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jc}B79bxJ+iLd! z002!%L_t(I%VS)==E(nhj~N)wUi-rk>dwMIDx3K~e_Vr&5fcL^I}^j66Mq;;WiuIT zu`sOO`G-MCmVtpBHWRrTVeC;ajCx_z3lKH{$#M!f>Fbh+00000NkvXXu0mjfn%pMC literal 0 HcmV?d00001