Annotate

util/human/io.lua @ 10891:8d47858805c9

util.human.io: Add padleft, padright and a table printing function
author Matthew Wild <mwild1@gmail.com>
date Wed, 03 Jun 2020 22:21:17 +0100
parent 10872:a3f3f42736f2
child 10893:a256044c1d12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10870
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local function getchar(n)
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local stty_ret = os.execute("stty raw -echo 2>/dev/null");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local ok, char;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 if stty_ret == true or stty_ret == 0 then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 ok, char = pcall(io.read, n or 1);
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 os.execute("stty sane");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 else
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 ok, char = pcall(io.read, "*l");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 if ok then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 char = char:sub(1, n or 1);
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 if ok then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 return char;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local function getline()
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local ok, line = pcall(io.read, "*l");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 if ok then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 return line;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local function getpass()
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local stty_ret, _, status_code = os.execute("stty -echo 2>/dev/null");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 if status_code then -- COMPAT w/ Lua 5.1
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 stty_ret = status_code;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 if stty_ret ~= 0 then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 io.write("\027[08m"); -- ANSI 'hidden' text attribute
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local ok, pass = pcall(io.read, "*l");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 if stty_ret == 0 then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 os.execute("stty sane");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 else
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 io.write("\027[00m");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 io.write("\n");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 if ok then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 return pass;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 local function show_yesno(prompt)
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 io.write(prompt, " ");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 local choice = getchar():lower();
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 io.write("\n");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 if not choice:match("%a") then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 choice = prompt:match("%[.-(%U).-%]$");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 if not choice then return nil; end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 return (choice == "y");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 local function read_password()
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 local password;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 while true do
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 io.write("Enter new password: ");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 password = getpass();
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 if not password then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 print("No password - cancelled");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 return;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 io.write("Retype new password: ");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 if getpass() ~= password then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 if not show_yesno [=[Passwords did not match, try again? [Y/n]]=] then
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 return;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 else
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 break;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 return password;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 local function show_prompt(prompt)
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 io.write(prompt, " ");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local line = getline();
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 line = line and line:gsub("\n$","");
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 return (line and #line > 0) and line or nil;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 local function printf(fmt, ...)
10872
a3f3f42736f2 util.human.io: Fix variable name [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 10870
diff changeset
85 print(fmt:format(...));
10870
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 end
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
10891
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
88 local function padright(s, width)
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
89 return s..string.rep(" ", width-#s);
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
90 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
91
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
92 local function padleft(s, width)
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
93 return string.rep(" ", width-#s)..s;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
94 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
95
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
96 local function table(col_specs, max_width, padding)
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
97 max_width = max_width or 80;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
98 padding = padding or 4;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
99
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
100 local widths = {};
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
101 local total_width = max_width - padding;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
102 local free_width = total_width;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
103 -- Calculate width of fixed-size columns
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
104 for i = 1, #col_specs do
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
105 local width = col_specs[i].width or "0";
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
106 if not(type(width) == "string" and width:sub(-1) == "%") then
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
107 local title = col_specs[i].title;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
108 width = math.max(tonumber(width), title and (#title+1) or 0);
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
109 widths[i] = width;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
110 free_width = free_width - width;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
111 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
112 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
113 -- Calculate width of %-based columns
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
114 for i = 1, #col_specs do
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
115 if not widths[i] then
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
116 local pc_width = tonumber((col_specs[i].width:gsub("%%$", "")));
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
117 widths[i] = math.floor(free_width*(pc_width/100));
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
118 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
119 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
120
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
121 return function (row, f)
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
122 for i, column in ipairs(col_specs) do
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
123 local width = widths[i];
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
124 local v = tostring(row[column.key or i] or ""):sub(1, width);
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
125 if #v < width then
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
126 if column.align == "right" then
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
127 v = padleft(v, width-1).." ";
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
128 else
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
129 v = padright(v, width);
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
130 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
131 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
132 (f or io.stdout):write(v);
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
133 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
134 (f or io.stdout):write("\n");
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
135 end;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
136 end
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
137
10870
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 return {
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 getchar = getchar;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 getline = getline;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 getpass = getpass;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 show_yesno = show_yesno;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 read_password = read_password;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 show_prompt = show_prompt;
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 printf = printf;
10891
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
146 padleft = padleft;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
147 padright = padright;
8d47858805c9 util.human.io: Add padleft, padright and a table printing function
Matthew Wild <mwild1@gmail.com>
parents: 10872
diff changeset
148 table = table;
10870
3f1889608f3e util.human.io: New central place for UI helpers
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 };