Merge branch 'master' of git@github.com:Baystation12/Baystation12

This commit is contained in:
cib
2012-07-05 09:59:02 +04:00
23 changed files with 185 additions and 87 deletions

View File

@@ -204,6 +204,7 @@
#define FILE_DIR "icons/spideros_icons"
#define FILE_DIR "icons/Testing"
#define FILE_DIR "icons/turf"
#define FILE_DIR "icons/vehicles"
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"

View File

@@ -20,40 +20,39 @@ obj/machinery/atmospherics
var/initialize_directions = 0
var/color
obj/machinery/atmospherics/var/initialize_directions = 0
obj/machinery/atmospherics/var/color
process()
build_network()
obj/machinery/atmospherics/process()
build_network()
proc
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
// Check to see if should be added to network. Add self if so and adjust variables appropriately.
// Note don't forget to have neighbors look as well!
obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
// Check to see if should be added to network. Add self if so and adjust variables appropriately.
// Note don't forget to have neighbors look as well!
return null
return null
build_network()
// Called to build a network from this node
obj/machinery/atmospherics/proc/build_network()
// Called to build a network from this node
return null
return null
return_network(obj/machinery/atmospherics/reference)
// Returns pipe_network associated with connection to reference
// Notes: should create network if necessary
// Should never return null
obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference)
// Returns pipe_network associated with connection to reference
// Notes: should create network if necessary
// Should never return null
return null
return null
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
// Used when two pipe_networks are combining
obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
// Used when two pipe_networks are combining
return_network_air(datum/network/reference)
// Return a list of gas_mixture(s) in the object
// associated with reference pipe_network for use in rebuilding the networks gases list
// Is permitted to return null
obj/machinery/atmospherics/proc/return_network_air(datum/network/reference)
// Return a list of gas_mixture(s) in the object
// associated with reference pipe_network for use in rebuilding the networks gases list
// Is permitted to return null
disconnect(obj/machinery/atmospherics/reference)
obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference)
update_icon()
return null
obj/machinery/atmospherics/update_icon()
return null

View File

@@ -134,6 +134,7 @@
P.name = template.name
P.desc = template.desc
P.icon = template.icon
P.img = template:img
sleep(30)
job_num_copies -= 1

View File

@@ -88,7 +88,7 @@
/obj/item/weapon/storage/pillbottlebox
name = "box of pill bottles"
desc = "It has pictures of pill bottles on its front."
icon_state = "box"
icon_state = "pillbox"
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
@@ -292,12 +292,19 @@
update_icon()
for(var/obj/item/weapon/card/id/ID in contents)
if(ID.icon_state == "gold")
icon_state = "walletid_gold"
return
else if(ID.icon_state == "id")
icon_state = "walletid"
return
switch(ID.icon_state)
if("id")
icon_state = "walletid"
return
if("silver")
icon_state = "walletid_silver"
return
if("gold")
icon_state = "walletid_gold"
return
if("centcom")
icon_state = "walletid_centcom"
return
icon_state = "wallet"

View File

@@ -142,12 +142,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
/obj/machinery/newscaster/attack_hand(mob/user as mob)
if(!src.ispowered || src.isbroken)
return
if(istype(user, /mob/living/carbon/human) )
var/mob/living/carbon/human/human_user = user
if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) )
var/mob/living/human_or_robot_user = user
var/dat
dat = text("<HEAD><TITLE>Newscaster</TITLE></HEAD><H3>Newscaster Unit #[src.unit_no]</H3>")
src.scan_user(human_user) //Newscaster scans you
src.scan_user(human_or_robot_user) //Newscaster scans you
switch(screen)
if(0)
@@ -160,7 +160,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
dat+= "<BR><A href='?src=\ref[src];create_feed_story=1'>Submit new Feed story</A>"
dat+= "<BR><A href='?src=\ref[src];menu_paper=1'>Print newspaper</A>"
dat+= "<BR><A href='?src=\ref[src];refresh=1'>Re-scan User</A>"
dat+= "<BR><BR><A href='?src=\ref[human_user];mach_close=newscaster_main'>Exit</A>"
dat+= "<BR><BR><A href='?src=\ref[human_or_robot_user];mach_close=newscaster_main'>Exit</A>"
if(src.securityCaster)
var/wanted_already = 0
for(var/obj/machinery/newscaster/N in allCasters)
@@ -363,8 +363,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
human_user << browse(dat, "window=newscaster_main;size=400x600")
onclose(human_user, "newscaster_main")
human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600")
onclose(human_or_robot_user, "newscaster_main")
/*if(src.isbroken) //debugging shit
return
@@ -377,7 +377,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.machine = src
if(href_list["set_channel_name"])
src.channel_name = strip_html(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
@@ -444,6 +444,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
FC.messages += newMsg // To avoid further confusion, this one for adds the message to all existing newscasters' channel_list's channels.
break // Another for to go through newscasters is not needed. Due to the nature of submit_new_CHANNEL, every reference
src.screen=4 // to a channel in ANY newscaster is the same. Editing one will edit them all.
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(src.channel_name)
@@ -747,7 +748,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob)
obj/item/weapon/newspaper/Topic(href, href_list)
var/mob/living/U = usr
..()
if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ))
U.machine = src
if(href_list["next_page"])
if(curr_page==src.pages+1)
@@ -796,21 +797,26 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
////////////////////////////////////helper procs
/obj/machinery/newscaster/proc/scan_user(mob/living/carbon/human/human_user as mob)
if(human_user.wear_id) //Newscaster scans you
if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo!
var/obj/item/device/pda/P = human_user.wear_id
if(P.id)
src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
/obj/machinery/newscaster/proc/scan_user(mob/living/user as mob)
if(istype(user,/mob/living/carbon/human)) //User is a human
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id) //Newscaster scans you
if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo!
var/obj/item/device/pda/P = human_user.wear_id
if(P.id)
src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
else
src.scanned_user = "Unknown"
else if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
var/obj/item/weapon/card/id/ID = human_user.wear_id
src.scanned_user ="[ID.registered_name] ([ID.assignment])"
else
src.scanned_user = "Unknown"
else if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
var/obj/item/weapon/card/id/ID = human_user.wear_id
src.scanned_user ="[ID.registered_name] ([ID.assignment])"
src.scanned_user ="Unknown"
else
src.scanned_user ="Unknown"
else
src.scanned_user ="Unknown"
var/mob/living/silicon/ai_user = user
src.scanned_user = "[ai_user.name] ([ai_user.job])"
/obj/machinery/newscaster/proc/print_paper()

View File

@@ -103,7 +103,8 @@
var/n_name = input(usr, "What would you like to label the photo?", "Photo Labelling", src.name) as text
n_name = copytext(n_name, 1, 32)
if ((loc == usr && usr.stat == 0))
//loc.loc check is for making possible renaming photos in clipboards
if (( (src.loc == usr || (src.loc.loc && src.loc.loc == usr)) && usr.stat == 0))
name = "photo[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
return
@@ -203,7 +204,10 @@
y_c--
x_c = x_c - 3
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo( get_turf(src) )
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
P.loc = usr.loc
if(!user.get_inactive_hand())
usr.put_in_inactive_hand(P)
var/icon/small_img = icon(temp)
var/icon/ic = icon('items.dmi',"photo")
small_img.Scale(8,8)

View File

@@ -101,7 +101,8 @@ NOTEBOOK
return
var/n_name = input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text
n_name = copytext(n_name, 1, 32)
if ((src.loc == usr && usr.stat == 0))
//loc.loc check is for making possible renaming papers in clipboards
if ((src.loc == usr || (src.loc.loc && src.loc.loc == usr) && usr.stat == 0))
src.name = n_name && n_name != "" ? n_name : "Untitled paper"
src.add_fingerprint(usr)
return
@@ -633,8 +634,24 @@ NOTEBOOK
var/dat = "<B>Clipboard</B><BR>"
if (src.pen)
dat += text("<A href='?src=\ref[];pen=1'>Remove Pen</A><BR><HR>", src)
for(var/obj/item/weapon/paper/P in src)
dat += text("<A href='?src=\ref[];read=\ref[]'>[]</A> <A href='?src=\ref[];write=\ref[]'>Write</A> <A href='?src=\ref[];remove=\ref[]'>Remove</A><BR>", src, P, P.name, src, P, src, P)
dat += "<table>"
for(var/obj/item/weapon/W in src)
dat += "<tr>"
if (istype(W, /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
dat += text("<td><A href='?src=\ref[];read=\ref[]'>[]</A></td><td> \
<A href='?src=\ref[];write=\ref[]'>Write</A></td><td> \
<A href='?src=\ref[];rname=\ref[]'>Rename</A></td><td> \
<A href='?src=\ref[];remove=\ref[]'>Remove</A><BR></td>", \
src, P, P.name, src, P, src, P, src, P)
if (istype(W, /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
dat += text("<td><A href='?src=\ref[];read=\ref[]'>[]</A></td><td> \
<A href='?src=\ref[];rname=\ref[]'>Rename</A></td><td> \
<A href='?src=\ref[];remove=\ref[]'>Remove</A><BR></td>" \
, src, P, P.name, src, P, src, P)
dat += "</tr>"
dat += "</table>"
user << browse(dat, "window=clipboard")
onclose(user, "clipboard")
return
@@ -679,6 +696,16 @@ NOTEBOOK
usr.update_clothing()
P.add_fingerprint(usr)
src.add_fingerprint(usr)
if (href_list["rname"])
var/obj/item/I = locate(href_list["rname"])
if ((I && I.loc == src))
if (istype(I, /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = I
P.rename()
if (istype(I, /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = I
P.rename()
src.add_fingerprint(usr)
if (href_list["write"])
var/obj/item/P = locate(href_list["write"])
if ((P && P.loc == src))
@@ -692,13 +719,25 @@ NOTEBOOK
P.attackby(src.pen, usr)
src.add_fingerprint(usr)
if (href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"])
if ((P && P.loc == src))
if (!( istype(usr, /mob/living/carbon/human) ))
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, stars(P.info)), text("window=[]", P.name))
onclose(usr, "[P.name]")
else
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, P.info), text("window=[]", P.name))
var/obj/item/I = locate(href_list["read"])
if ((I && I.loc == src))
if (istype(I, /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = I
if (!( istype(usr, /mob/living/carbon/human) ))
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, stars(P.info)), text("window=[]", P.name))
onclose(usr, "[P.name]")
else
var/t = dd_replacetext(P.info, "\n", "<BR>")
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", P.name, t), text("window=[]", P.name))
onclose(usr, "[P.name]")
if (istype(I, /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = I
usr << browse_rsc(P.img, "tmp_photo.png")
usr << browse("<html><head><title>Photo</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Writings on the back:<br><i>[P.scribble]</i>" : ]"\
+ "</body></html>", "window=book;size=200x[P.scribble ? 400 : 200]")
onclose(usr, "[P.name]")
if (ismob(src.loc))
var/mob/M = src.loc
@@ -733,7 +772,7 @@ NOTEBOOK
/obj/item/weapon/clipboard/attackby(obj/item/weapon/P as obj, mob/user as mob)
..()
if (istype(P, /obj/item/weapon/paper))
if (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo))
if (src.contents.len < 15)
user.drop_item()
P.loc = src

View File

@@ -75,7 +75,12 @@
H.apply_effect(10, STUTTER, 0)
user.lastattacked = M
H.lastattacker = user
charges--
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(50)
else
charges--
H.visible_message("<span class='danger'>[M] has been stunned with the [src] by [user]!</span>")
playsound(src.loc, 'Egloves.ogg', 50, 1, -1)
if(charges < 1)

View File

@@ -262,6 +262,8 @@ SHARDS
playsound(src.loc, 'glass_step.ogg', 50, 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.mutantrace == "lizard") //Soghun have... Scales? Yeah that works
return
if(!((H.shoes) || (H.wear_suit && H.wear_suit.body_parts_covered & FEET)))
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ROBOT)

View File

@@ -1,12 +1,5 @@
/obj/item/weapon/storage/briefcase/New()
..()
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(src)
/obj/item/weapon/storage/briefcase/attack(mob/M as mob, mob/living/user as mob)
//..()

View File

@@ -145,7 +145,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap
randomItems.Add("/obj/item/weapon/storage/toolbox/syndicate") //Syndicate Toolbox
if(!randomItems)
if(!randomItems.len)
del(randomItems)
return 0
else

View File

@@ -58,7 +58,10 @@
var/obj/item/weapon/grab/G = I
var/mob/GM = G.affecting
if(ismob(G.affecting))
if(G.state>1 && GM.loc == get_turf(src))
if(G.state>1)
if(!GM.loc == get_turf(src))
user << "<span class='notice'>[GM.name] needs to be on the toilet.</span>"
return
if(open && !swirlie)
user.visible_message("<span class='danger'>[user] starts to give [GM.name] a swirlie!</span>", "<span class='notice'>You start to give [GM.name] a swirlie!</span>")
swirlie = GM
@@ -101,7 +104,10 @@
var/obj/item/weapon/grab/G = I
var/mob/GM = G.affecting
if(ismob(G.affecting))
if(G.state>1 && GM.loc == get_turf(src))
if(G.state>1)
if(!GM.loc == get_turf(src))
user << "<span class='notice'>[GM.name] needs to be on the urinal.</span>"
return
user.visible_message("<span class='danger'>[user] slams [GM.name] into the [src]!</span>", "<span class='notice'>You slam [GM.name] into the [src]!</span>")
GM.adjustBruteLoss(8)
else

View File

@@ -266,7 +266,8 @@ proc/move_mining_shuttle()
/*****************************Shovel********************************/
/obj/item/weapon/shovel
name = "Shovel"
name = "shovel"
desc = "A large tool for digging and moving dirt."
icon = 'items.dmi'
icon_state = "shovel"
flags = FPRINT | TABLEPASS| CONDUCT
@@ -278,11 +279,14 @@ proc/move_mining_shuttle()
m_amt = 50
origin_tech = "materials=1;engineering=1"
/obj/item/weapon/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
icon_state = "spade"
item_state = "spade"
force = 5.0
throwforce = 7.0
w_class = 2.0
/**********************Mining car (Crate like thing, not the rail car)**************************/

View File

@@ -132,6 +132,8 @@ datum/preferences
// OOC Metadata:
var/metadata = ""
var/sound_adminhelp = 0
New()
hair_style = new/datum/sprite_accessory/hair/short
@@ -265,9 +267,13 @@ datum/preferences
if(config.allow_Metadata)
dat += "<b>OOC Notes:</b> <a href='byond://?src=\ref[user];preferences=1;OOC=input'> Edit </a><br>"
if((user.client) && (user.client.holder) && (user.client.holder.rank) && (user.client.holder.level >= 5))
dat += "<hr><b>OOC</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change colour</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font>"
if((user.client) && (user.client.holder) && (user.client.holder.rank))
dat += "<hr><b>Adminhelp sound</b>: "
dat += "[(sound_adminhelp)?"On":"Off"] <a href='byond://?src=\ref[user];preferences=1;toggleadminhelpsound=1'>toggle</a>"
if(user.client.holder.level >= 5)
dat += "<hr><b>OOC</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change color</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font>"
dat += "<hr><b>Occupation Choices</b><br>"
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>Set Preferences</b></a><br>"
@@ -906,6 +912,9 @@ datum/preferences
if(ooccolor)
src.ooccolor = ooccolor
if(link_tags["toggleadminhelpsound"])
src.sound_adminhelp = !src.sound_adminhelp
if(link_tags["f_style"])
if(species != "Human") //Non-humans don't have hair stuff yet.
return
@@ -1268,6 +1277,7 @@ datum/preferences
proc/setup_client(var/client/C)
if(C)
C.sound_adminhelp = src.sound_adminhelp
C.midis = src.midis
C.ooccolor = src.ooccolor
C.be_alien = be_special & BE_ALIEN

View File

@@ -161,6 +161,8 @@ datum/preferences/proc/savefile_save(mob/user, slot)
F["OOC_Notes"] << src.metadata
F["sound_adminhelp"] << src.sound_adminhelp
return 1
// loads the savefile corresponding to the mob's ckey
@@ -269,6 +271,8 @@ datum/preferences/proc/savefile_load(mob/user, slot)
F["OOC_Notes"] >> src.metadata
F["sound_adminhelp"] >> src.sound_adminhelp
if(isnull(metadata))
metadata = ""

View File

@@ -57,14 +57,23 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<div class="commit sansserif">
<h2 class="date">29 June 2012</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Raises job limits for Botanists, Atmospheric Technicnians, Roboticists, Chemists, and Geneticists.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">28 June 2012</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">'Rename' function for clipboards</li>
<li class="rscadd">Can add photos to clipboards</li>
<li class="bugfix">Fixed troubles with formatting when reading from clipboard (linebreaks not being properly placed)</li>
<li class="bugfix">Fixed photocopiers not copying photos properly</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">27 June 2012</h2>
<h3 class="author">Erthilo updated:</h3>
@@ -82,6 +91,14 @@ should be listed in the changelog upon commit though. Thanks. -->
<li class="bugfix">Fixes medical items. Gauze/kits/ointment can now be applied correctly again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">26 June 2012</h2>
<h3 class="author">TG updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed silicon mobs not being able to access newscaster.</li>
<li class="bugfix">Fixed harmbatons on everything other than harm, now it is the opposite way round.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">25 June 2012</h2>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

BIN
icons/vehicles/vehicles.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB