sorcery  Check-in [3f6a913e4e]

Overview
Comment:* remove former hacky registration system, replace with consistent and flexible API; rewrite metal/gem generation to take advantage of this new API; tweaks to init system to enable world-local tweaks to lore and sorcery behavior * initial documentation commit * initial steps towards calendar - add default date format, astrolabe; prepare infra for division/melding/transmutation spells, various tweaks and fixes
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 3f6a913e4e6dd7db76536dfddcffdef0e3fd8525daea982a6cd5c9e6cc7a5de1
User & Date: lexi on 2020-09-29 12:40:28
Other Links: manifest | tags
Context
2020-10-19
09:52
continue dev on celestial mechanics, add melding+division spells (resonance), refine itemclasses, add keypunch and punchcards, add paper pulp, add a shitload of visuals, add convenience scripts for working with the wiki, make the flamebolt spell actually useful instead of just a pretty lightshow, add essences, inferno crystal, and other goodies; iterate on wands, lots of shit i can't remember, various bugfixes check-in: ea6e475e44 user: lexi tags: trunk
2020-09-29
12:40
* remove former hacky registration system, replace with consistent and flexible API; rewrite metal/gem generation to take advantage of this new API; tweaks to init system to enable world-local tweaks to lore and sorcery behavior * initial documentation commit * initial steps towards calendar - add default date format, astrolabe; prepare infra for division/melding/transmutation spells, various tweaks and fixes check-in: 3f6a913e4e user: lexi tags: trunk
2020-09-26
18:49
add writing stand for editing codexes; add scissors, ink, erasure fluid, pens; touch up codex UI; add many recipe notes; add craft divination type for crafttools; defuckulate fucktarded crafttool impl; enhance table library with missing features like lua's table.unpack; many bug fixes and enhancements; blood for the blood god check-in: 72eebac4bc user: lexi tags: trunk
Changes

Added astrolabe.lua version [6f8619640d].





























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
local albox = {
	type = 'fixed';
	fixed = {
		-0.43,-0.5,-0.43;
		 0.43, 0.3, 0.43;
	};
}
minetest.register_node('sorcery:astrolabe',{
	description = 'Astrolabe';
	drawtype = 'mesh';
	mesh = 'sorcery-astrolabe.obj';
	groups = {
		cracky = 2, choppy = 2;
		oddly_breakable_by_hand = 2;
		sorcery_tech = 1;
	};
	selection_box = albox, collision_box = albox;
	after_dig_node = sorcery.lib.node.purge_containers;
	tiles = {
		'default_steel_block.png';
		'default_bronze_block.png';
		'default_copper_block.png';
		'default_aspen_wood.png';
	};
	_sorcery = {
		recipe = {
			note = 'Unravel the secrets of the stars';
		};
	};
})

Added calendar.lua version [f67589c567].















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
if not sorcery then
	sorcery = { data = {
		calendar = dofile('data/calendar.lua');
		signs = dofile('data/signs.lua');
	} }
end

sorcery.calendar = {}

sorcery.calendar.stats = function(style)
	if not style then style = sorcery.data.calendar.default end
	local s = sorcery.data.calendar.styles[style]
	local days, moons, weeks = s.days, s.moons, s.weeks

	return {
		days_in_year = #moons * #weeks * #days;
		days_in_week = #days;
		days_in_moon = #days * #weeks;
		weeks_in_moon = #weeks;
		weeks_in_year = #weeks * #moons;
		moons_in_year = #moons;
	}
end

sorcery.calendar.date = function(day,style)
	local s = sorcery.calendar.stats(style)

	local day_of_year = day % s.days_in_year;
	local day_of_moon = day_of_year % s.days_in_moon;
	local day_of_week = day_of_moon % s.days_in_week;

	return {
		day_of_year = 1 + day_of_year;
		day_of_moon = 1 + day_of_moon;
		day_of_week = 1 + day_of_week;
		week_of_moon = 1 + math.floor(day_of_moon / s.days_in_week);
		week_of_year = 1 + math.floor(day_of_year / s.days_in_week);
		moon_of_year = 1 + math.floor(day_of_year / s.days_in_moon);
		year = math.floor(day / s.days_in_year);
		moons_passed = math.floor(day / s.days_in_moon);
		weeks_passed = math.floor(day / s.days_in_week);
	}
end

sorcery.calendar.stars = function(day,style)
	local periods = math.floor(day / sorcery.data.calendar.days_per_stellar_cycle)

	local elapsed = 0
	local cycle = 1
	while true do
		for _, c in pairs(sorcery.data.signs) do
			if c.cycle then
				if cycle % c.cycle ~= 0 then goto skip end
			end
			elapsed = elapsed + c.duration
			if elapsed >= periods then
				return {
					sign = c;
					cycle = cycle;
				}
			end
		::skip::end
		cycle = cycle + 1
	end
end

sorcery.calendar.longdate = function(day)
	if not style then style = sorcery.data.calendar.default end
	return sorcery.data.calendar.styles[style].longdate(sorcery.calendar.date(day))
end

sorcery.calendar.shortdate = function(day,style)
	if not style then style = sorcery.data.calendar.default end
	return sorcery.data.calendar.styles[style].shortdate(sorcery.calendar.date(day))
end

sorcery.calendar.stardate = function(day)
	local s = sorcery.calendar.stars(day)
	return string.format('sign of the %s, stellar cycle %u', s.sign.patron, s.cycle)
end

-- math.randomseed(os.time())
-- local d = math.random(500,256000)
-- print(string.format('%s :: %s in the %s',
-- 	sorcery.calendar.shortdate(d),
-- 	sorcery.calendar.longdate(d),
-- 	sorcery.calendar.stardate(d)))

Modified coins.lua from [2702148c37] to [7e4d0ae5aa].

12
13
14
15
16
17
18
19
















20
21
22
23
24
25










26
27
28

29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
...
136
137
138
139
140
141
142
143
144
145

146
147
148
149
150
151
152
	local g = sorcery.data.gems[gem]
	local desc = (m.desc or metal) .. ' Coin'
	local coinimg = u.image('sorcery_coin.png'):multiply(u.color(m.tone))
	local id = 'sorcery:coin_' .. metal
	if gem then
		desc = (g.desc or gem) .. '-' .. desc
		coinimg = u.image('sorcery_coin_gem.png'):multiply(u.color(g.tone)):blit(coinimg)
		id = id .. '_' .. gem
















	end

	minetest.register_craftitem(id, {
		description = u.str.capitalize(desc);
		inventory_image = coinimg:render();
		groups = { sorcery_coin = 1 };










	})
end
for metal in pairs(sorcery.data.metals) do

	register_coin(metal)
	for gem in pairs(sorcery.data.gems) do

		register_coin(metal,gem)
	end
end
local update_press_output = function(meta)
	local inv = meta:get_inventory()
	local slot_ingot = inv:get_stack('ingot',1)
	local slot_gem   = inv:get_stack('gem',1)
	local metalname, gemname
	local coincount
	if not inv:is_empty('ingot') then
		local id = slot_ingot:get_name()
		for name,metal in pairs(sorcery.data.metals) do
			if id == metal.ingot then
				metalname = name
				coincount = slot_ingot:get_count()
				goto foundmetal
			end
		end
	end
	inv:set_stack('output',1,ItemStack(nil))
	do return end

	::foundmetal:: if not inv:is_empty('gem') then
		local id = slot_gem:get_name()
		for name,gem in pairs(sorcery.data.gems) do
			if gem.foreign then
				if id == gem.foreign then gemname = name 
					else goto skip end
			else
				if id == 'sorcery:gem_' .. name then gemname = name
					else goto skip end
			end
			coincount = math.min(coincount, slot_gem:get_count())
			do break end
		::skip::end
	end
	
	coincount = coincount * coins_per_ingot

................................................................................
					listring[current_player;main]
		]])
	end;
	allow_metadata_inventory_put = function(pos,list,idx,stack,user)
		local id = stack:get_name()
		if list == 'ingot' then
			for name,metal in pairs(sorcery.data.metals) do
				if id == metal.ingot then goto okay end
			end
		elseif list == 'gem' then
			for name,gem in pairs(sorcery.data.gems) do
				if gem.foreign then
					if id == gem.foreign then goto okay end
				else
					if id == 'sorcery:gem_' .. name then goto okay end
................................................................................
		do return 0 end
		::okay:: return max_components
	end;
	-- mercifully there is never any case where moving between the
	-- inventories of the node is allowable
	allow_metadata_inventory_move = function() return 0 end;
	allow_metadata_inventory_take = function(pos,list,idx,stack,user)
		local meta = minetest.get_meta(pos)
		local inv = meta:get_inventory()
		return inv:get_stack(list,idx):get_count()

	end;
	on_metadata_inventory_put = function(pos,list,idx,stack,user)
		update_press_output(minetest.get_meta(pos))
	end;
	on_metadata_inventory_take = function(pos,list,idx,stack,user)
		local meta = minetest.get_meta(pos)
		if list == 'output' then







|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|
>
>
>
>
>
>
>
>
>
>


|
>

|
>

|
|









|












<
|
<
<
|
|
<







 







|







 







|
|
|
>







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

84


85
86

87
88
89
90
91
92
93
...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
...
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
	local g = sorcery.data.gems[gem]
	local desc = (m.desc or metal) .. ' Coin'
	local coinimg = u.image('sorcery_coin.png'):multiply(u.color(m.tone))
	local id = 'sorcery:coin_' .. metal
	if gem then
		desc = (g.desc or gem) .. '-' .. desc
		coinimg = u.image('sorcery_coin_gem.png'):multiply(u.color(g.tone)):blit(coinimg)
		local gemid = id .. '_' .. gem
		minetest.register_craft {
			type = 'shapeless';
			recipe = { 'xdecor:hammer', gemid };
			output = g.parts.shard;
			replacements = {
				{'xdecor:hammer', 'xdecor:hammer'};
				{gemid, id};
			};
		}
		id = gemid
	else
		minetest.register_craft {
			type = 'cooking';
			recipe = id .. ' 2';
			output = m.parts.fragment;
		}
	end

	minetest.register_craftitem(id, {
		description = u.str.capitalize(desc);
		inventory_image = coinimg:render();
		groups = {
			coin = 1; sorcery_coin = 1; metal = 1;
			not_in_creative_inventory = 1;
			-- nice try mr lenin
		};
		_sorcery = {
			material = (gem == nil) and {
				metal = true; id = metal, data = m;
				grindcost = 2, grindvalue = 1;
			} or nil;
		};
	})
end
-- for metal in pairs(sorcery.data.metals) do
sorcery.register.metals.foreach('sorcery:mkcoins',{'sorcery:generate'}, function(metal)
	register_coin(metal)
	-- for gem in pairs(sorcery.data.gems) do
	sorcery.register.gems.foreach('sorcery:mkcoins_' .. metal, {'sorcery:generate'}, function(gem)
		register_coin(metal,gem)
	end)
end)
local update_press_output = function(meta)
	local inv = meta:get_inventory()
	local slot_ingot = inv:get_stack('ingot',1)
	local slot_gem   = inv:get_stack('gem',1)
	local metalname, gemname
	local coincount
	if not inv:is_empty('ingot') then
		local id = slot_ingot:get_name()
		for name,metal in pairs(sorcery.data.metals) do
			if id == metal.parts.ingot then
				metalname = name
				coincount = slot_ingot:get_count()
				goto foundmetal
			end
		end
	end
	inv:set_stack('output',1,ItemStack(nil))
	do return end

	::foundmetal:: if not inv:is_empty('gem') then
		local id = slot_gem:get_name()
		for name,gem in pairs(sorcery.data.gems) do

			if id == gem.parts.item


				then gemname = name
				else goto skip end

			coincount = math.min(coincount, slot_gem:get_count())
			do break end
		::skip::end
	end
	
	coincount = coincount * coins_per_ingot

................................................................................
					listring[current_player;main]
		]])
	end;
	allow_metadata_inventory_put = function(pos,list,idx,stack,user)
		local id = stack:get_name()
		if list == 'ingot' then
			for name,metal in pairs(sorcery.data.metals) do
				if id == metal.parts.ingot then goto okay end
			end
		elseif list == 'gem' then
			for name,gem in pairs(sorcery.data.gems) do
				if gem.foreign then
					if id == gem.foreign then goto okay end
				else
					if id == 'sorcery:gem_' .. name then goto okay end
................................................................................
		do return 0 end
		::okay:: return max_components
	end;
	-- mercifully there is never any case where moving between the
	-- inventories of the node is allowable
	allow_metadata_inventory_move = function() return 0 end;
	allow_metadata_inventory_take = function(pos,list,idx,stack,user)
		local count = stack:get_count()
		if list == 'output' then
			return (count % coins_per_ingot) == 0 and count or 0
		else return count end
	end;
	on_metadata_inventory_put = function(pos,list,idx,stack,user)
		update_press_output(minetest.get_meta(pos))
	end;
	on_metadata_inventory_take = function(pos,list,idx,stack,user)
		local meta = minetest.get_meta(pos)
		if list == 'output' then

Modified compat.lua from [c2cb3e762c] to [13321ca8da].

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43





44
45
46
47
48
49
end

if minetest.get_modpath("new_campfire") then
	minetest.register_alias('sorcery:ash', 'new_campfire:ash')
else
	minetest.register_craftitem('sorcery:ash', {
		description = 'Ash';
		inventory_image = 'sorcery_iron_powder.png^[colorize:#FFFFFF:100';
	})
	minetest.register_alias('new_campfire:ash', 'sorcery:ash')
end

-- xdecor offers a conflicting and somewhat poorly designed enchantment
-- mechanism; make it inaccessible but don't fuck up already existing
-- enchanters in the world
minetest.clear_craft { output='xdecor:enchanter'; }






return {
	defp = function(name)
		return minetest.registered_items[name] or minetest.registered_aliases[name]
	end;
}







|







|
>
>
>
>
>






28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
end

if minetest.get_modpath("new_campfire") then
	minetest.register_alias('sorcery:ash', 'new_campfire:ash')
else
	minetest.register_craftitem('sorcery:ash', {
		description = 'Ash';
		inventory_image = 'sorcery_iron_powder.png^[colorize:#FFFFFF:60';
	})
	minetest.register_alias('new_campfire:ash', 'sorcery:ash')
end

-- xdecor offers a conflicting and somewhat poorly designed enchantment
-- mechanism; make it inaccessible but don't fuck up already existing
-- enchanters in the world
minetest.clear_craft { output='xdecor:enchantment_table'; }
minetest.override_item('xdecor:enchantment_table', {
	groups = sorcery.lib.tbl.merge(minetest.registered_items['xdecor:enchantment_table'].groups, {
		not_in_creative_inventory = 1;
	})
})

return {
	defp = function(name)
		return minetest.registered_items[name] or minetest.registered_aliases[name]
	end;
}

Modified cookbook.lua from [f535fa81e6] to [62888214aa].

78
79
80
81
82
83
84
85

86












87





88
89


90
91
92
93
94

95
96
97
98

99
100
101
102
103
104
105
...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
...
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
...
356
357
358
359
360
361
362

363

364
365

366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
				    (restrict.mod   and module ~= restrict.mod)
				 or (restrict.group and (minetest.get_item_group(k, restrict.group) == 0))
			))) then names[#names + 1] = k end
		end
	end
	return names[math.random(#names)]
end end
local find_builtin = function(out)

	local rec = {}












	local i = minetest.get_craft_recipe(out)





	if i == nil or i.items == nil or #i.items == 0 then return nil end
	local w = (i.width == 0) and 3 or i.width


	-- for j=1,#i.items do
	for j,item in pairs(i.items) do
		local row = math.floor((j-1) / w)
		local col = (j-1) % w
		if i.items[j] then

			rec[1 + (row * 3) + col] = i.items[j]
		end
	end
	return rec

end
local function group_eval(i)
	if string.sub(i,1,6) == 'group:' then
		local g = string.sub(i,7)
		if constants.group_ids[g] then
			return constants.group_ids[g].cnitem,
			       constants.group_ids[g].caption
................................................................................
		name = 'Crafting Guide';
		node = 'xdecor:workbench';
		booksuf = 'Codex';
		w = 3, h = 3;
		chance = 2;
		slots = slot3x3;
		pick = pick_builtin('normal');
		find = find_builtin;
		props = props_builtin;
		apply_exclusions = true;
	};
	-- smelt = {
	-- 	w = 3, h = 3;
	-- 	slots = slot3x3;
	-- };
................................................................................
		name = 'Cooking Recipe';
		node = 'default:furnace';
		booksuf = 'Cookbook';
		w = 1, h = 1;
		chance = 3;
		slots = {{-0.2,0}};
		pick = pick_builtin('cooking');
		find = find_builtin;
		props = props_builtin;
		apply_exclusions = true;
	};
	infuse = {
		name = 'Infusion Recipe';
		node = 'sorcery:infuser';
		booksuf = 'Pharmacopeia';
................................................................................

	return recipe_kinds[kind].pick(restrict), kind
end

local render_recipe = function(kind,ingredients,result,notes_right)
	local k = recipe_kinds[kind]
	local t = ''

	for i=1,#k.slots do

		local x, y = k.slots[i][1], k.slots[i][2]
		if ingredients[i] and ingredients[i] ~= '' then

			local tt
			if k.indesc then tt = k.indesc(ingredients[i]) else tt = desc_builtin(ingredients[i]) end
			t = t .. string.format([[
				item_image[%f,%f;1,1;%s]
				tooltip[%f,%f;1,1;%s]
			]], x,y, minetest.formspec_escape(group_eval(ingredients[i])),
			    x,y, minetest.formspec_escape(tt))
		else
			if k.drawslots == nil or k.drawslots then
				t = string.format('box[%f,%f;0.1,0.1;#00000060]',x+0.45,y+0.45) .. t
			end
		end
	end
	local img, ot
	local props = k.props(result)
	if props.note then
		local nx, ny, nw, nh
		if notes_right then
			nx = 5.25 ny = 0
			nw = 4 nh = 3
		else
			nx = 0 ny = 3







|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
|
|
>
>
|
|
|
|
<
>
|
|
|
|
>







 







|







 







|







 







>

>

<
>

|



|








<







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

114
115
116
117
118
119
120
121
122
123
124
125
126
...
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
...
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
...
377
378
379
380
381
382
383
384
385
386
387

388
389
390
391
392
393
394
395
396
397
398
399
400
401
402

403
404
405
406
407
408
409
				    (restrict.mod   and module ~= restrict.mod)
				 or (restrict.group and (minetest.get_item_group(k, restrict.group) == 0))
			))) then names[#names + 1] = k end
		end
	end
	return names[math.random(#names)]
end end
local find_builtin = function(method,kind)
	return function(out)
		local rec = {}
		local crec = sorcery.lib.tbl.walk(minetest.registered_items[out],{'_sorcery','recipe','canonical',kind})
		local w=0, lst
		if crec then
			lst = {}
			for i,v in pairs(crec) do
				if #v > w then w = #v end
				for j,n in pairs(v) do
					lst[#lst+1] = n
				end
			end
		else
			-- WHY IS THIS INTERFACE SO CLUMSY
			local all,i = minetest.get_all_craft_recipes(out), nil
			for _,r in pairs(all) do
				if r.method == method and r.items and #r.items>0 then
					i = r break
				end
			end
			if i == nil or i.items == nil or #i.items == 0 then return nil end
			w = (i.width == 0) and 3 or i.width
			lst = i.items
		end
		-- for j=1,#i.items do
		for j,item in pairs(lst) do
			local row = math.floor((j-1) / w)
			local col = (j-1) % w

			if item then
				rec[1 + (row * 3) + col] = item
			end
		end
		return rec
	end
end
local function group_eval(i)
	if string.sub(i,1,6) == 'group:' then
		local g = string.sub(i,7)
		if constants.group_ids[g] then
			return constants.group_ids[g].cnitem,
			       constants.group_ids[g].caption
................................................................................
		name = 'Crafting Guide';
		node = 'xdecor:workbench';
		booksuf = 'Codex';
		w = 3, h = 3;
		chance = 2;
		slots = slot3x3;
		pick = pick_builtin('normal');
		find = find_builtin('normal','craft');
		props = props_builtin;
		apply_exclusions = true;
	};
	-- smelt = {
	-- 	w = 3, h = 3;
	-- 	slots = slot3x3;
	-- };
................................................................................
		name = 'Cooking Recipe';
		node = 'default:furnace';
		booksuf = 'Cookbook';
		w = 1, h = 1;
		chance = 3;
		slots = {{-0.2,0}};
		pick = pick_builtin('cooking');
		find = find_builtin('cooking','cook');
		props = props_builtin;
		apply_exclusions = true;
	};
	infuse = {
		name = 'Infusion Recipe';
		node = 'sorcery:infuser';
		booksuf = 'Pharmacopeia';
................................................................................

	return recipe_kinds[kind].pick(restrict), kind
end

local render_recipe = function(kind,ingredients,result,notes_right)
	local k = recipe_kinds[kind]
	local t = ''
	local props = k.props(result)
	for i=1,#k.slots do
		local ing = ingredients[i]
		local x, y = k.slots[i][1], k.slots[i][2]

		if ing and ing ~= '' then
			local tt
			if k.indesc then tt = k.indesc(ing) else tt = desc_builtin(ing) end
			t = t .. string.format([[
				item_image[%f,%f;1,1;%s]
				tooltip[%f,%f;1,1;%s]
			]], x,y, minetest.formspec_escape(group_eval(ing)),
			    x,y, minetest.formspec_escape(tt))
		else
			if k.drawslots == nil or k.drawslots then
				t = string.format('box[%f,%f;0.1,0.1;#00000060]',x+0.45,y+0.45) .. t
			end
		end
	end
	local img, ot

	if props.note then
		local nx, ny, nw, nh
		if notes_right then
			nx = 5.25 ny = 0
			nw = 4 nh = 3
		else
			nx = 0 ny = 3

Added data/calendar.lua version [9f638b5b65].









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
-- you can use your own month names and so on; even if you change
-- the length of the year the code will adapt

local days = {
	'Day of the Frozen River'; 'Day of Fell Shadow';
	'Day of Peaceful Splendor'; 'Day of Somber Reflection'; 
	'Day of Wrathful Visitation'; 'Day of Wistful Remembrance';
	'Day of the Warm Hearth'; 'Day of Joyous Worship';
	'Day of the Fond Farewell';
}

local weeks = {
	"Merchant's Week"; "Chandler's Week"; "Miller's Week";
	"Bard's Week"; "Cobbler's Week";
}

local moons = {
	'Splendormoon';
	'Embermoon';
	'Saddlemoon';
	'Candlemoon';
	'Cindermoon';
	'Diremoon';
	'Chancelmoon';
	'Starmoon';
	'Harvestmoon';
}

local yearadj = {
	'Whimpering';
	'Overturned';
	'Silent';
	'Whimsical';
	'Turbulent';
	'Parsimonius';
	'Rhadamanthine';
	'Exuberant';
	'Winsome';
	'Bifurcated';
}

local yearnoun = {
	'Princeling';
	'Applecart';
	'Oxcart';
	'Parsnip';
	'Lotus';
	'Daffodil';
}

local yg = function(y)
	local pos = -3
	local neg = y < 0
	y = tostring(math.abs(y))
	local n = ''
	while true do
		local w = string.sub(y,pos,pos+2)
		if w == nil or w == '' then break end 
		n = w .. ',' .. n
		pos = pos - 3
	end
	if neg then n = '-' .. n end
	return string.sub(n,1,-2)
end

return {
	days_per_stellar_cycle = 17;
	default = 'imperial';
	styles = {
		imperial = {
			name = 'Imperial Archipelagian Calendar';
			days = days, weeks = weeks, moons = moons;
			longdate = function(date)
				local day  = days [date.day_of_week ]
				local week = weeks[date.week_of_moon]
				local moon = moons[date.moon_of_year]
				return string.format('%s on %s in %s after %s years of the Imperial Revolution',day,week,moon,yg(date.year))
			end;
			shortdate = function(date)
				return string.format('%u/%u %s I.R.', date.day_of_moon, date.moon_of_year, yg(date.year))
			end;
		}
	}
}

Modified data/extracts.lua from [8583c46b62] to [c62e0cc7f2].

13
14
15
16
17
18
19

20
	raspberry = {"group:food_raspberries", {228,51,210}};
	chili = {"farming:chili_pepper", {243,75,49}};
	pine = {"default:pine_sapling", {41,166,80}};
	cocoa = {"farming:cocoa_beans", {146,38,0}};
	grape = {"farming:grapes", {206,56,214}};
	kelp = {"default:sand_with_kelp", {109,185,145}};
	fern = {"default:fern_1", {164,238,47}};

};







>

13
14
15
16
17
18
19
20
21
	raspberry = {"group:food_raspberries", {228,51,210}};
	chili = {"farming:chili_pepper", {243,75,49}};
	pine = {"default:pine_sapling", {41,166,80}};
	cocoa = {"farming:cocoa_beans", {146,38,0}};
	grape = {"farming:grapes", {206,56,214}};
	kelp = {"default:sand_with_kelp", {109,185,145}};
	fern = {"default:fern_1", {164,238,47}};
	marram = {"default:marram_grass_1", {127,255,210}};
};

Modified data/gems.lua from [0836376152] to [a046b8be6a].

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
			{affinity = {'praxic'}, confluence = 1};
			{affinity = {'praxic'}, confluence = 0.5};
			{affinity = {'cognic'}, confluence = 1};
			{affinity = {'syncretic'}, confluence = 0.9};
		};
	};
	luxite = {
		tone = {133,255,94};
		rarity = 130;
	};
	ruby = {
		tone = {255,94,161};
		rarity = 150;
	};
	amethyst = {







|







45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
			{affinity = {'praxic'}, confluence = 1};
			{affinity = {'praxic'}, confluence = 0.5};
			{affinity = {'cognic'}, confluence = 1};
			{affinity = {'syncretic'}, confluence = 0.9};
		};
	};
	luxite = {
		tone = {189,255,236};
		rarity = 130;
	};
	ruby = {
		tone = {255,94,161};
		rarity = 150;
	};
	amethyst = {

Modified data/gods.lua from [90d2603045] to [4ff6f034b6].

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
		};
	};

	blood = {
		name = 'Faramesti Surax';
		bless = {
			potions = {
				Force = {50, 7};
				Longevity = {65, 3};
			};
			tools = {
				rend = {80, 15};
			};
		};
		generosity = 4;
		stinginess = 9;
		idol = {
			desc = "Blood Idol";
			width = 0.7;







|
|


|







123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
		};
	};

	blood = {
		name = 'Faramesti Surax';
		bless = {
			potions = {
				Force = {favor=50, cost=5, chance=7};
				Longevity = {favor=65, cost=7, chance=3};
			};
			tools = {
				rend = {favor=80, cost=15, chance=20};
			};
		};
		generosity = 4;
		stinginess = 9;
		idol = {
			desc = "Blood Idol";
			width = 0.7;

Deleted data/register.lua version [d2f1e722e5].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
return {
	infusion = function(r)
		sorcery.data.infusions[#sorcery.data.infusions + 1] = r
	end;
	alloy = function(mix)
		sorcery.data.alloys[#sorcery.data.alloys + 1] = mix
	end;
	kiln_recipe = function(mix)
		sorcery.data.kilnrecs[#sorcery.data.kilnrecs + 1] = mix
	end;
	infusion_leftover = function(orig, leave)
		sorcery.data.infusion_leftovers[orig] = leave
	end;
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























Added data/resonance.lua version [63249807d4].





>
>
1
2
-- resonance is a mechanic whereby items which 'resonate' can be
-- transformed into each other by use of the divide/meld wands

Added data/signs.lua version [15046a03f7].

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- this unit defines astrological signs of various magical
-- significance. used to determine whether the stars are aligned

return {
	{id = 'minx', patron = 'Minx'; duration = 4 };
	{id = 'ocelot', patron = 'Ocelot'; duration = 3, cycle = 3};
	{id = 'wyvern', patron = 'Wyvern'; duration = 2, cycle = 2};
	{id = 'dove', patron = 'Dove'; duration = 4 };
	{id = 'leper', patron = 'Leper'; duration = 1, cycle = 3 };
	{id = 'petrel', patron = 'Petrel'; duration = 5 };
	{id = 'kestrel', patron = 'Kestrel'; duration = 6 };
	{id = 'serpent', patron = 'Serpent'; duration = 3, cycle = 2};
	{id = 'wserpent', patron = 'Winged Serpent'; duration = 3, cycle = 4 };
	{id = 'lamb', patron = 'Lamb'; duration = 4};
	{id = 'glamb', patron = 'Golden Lamb'; duration = 6, cycle = 5};
	{id = 'grackle', patron = 'Grackle'; duration = 3};
	{id = 'thief', patron = 'Thief'; duration = 2, cycle = 6};
	{id = 'egret', patron = 'Egret'; duration = 3};
	{id = 'chipmunk', patron = 'Chipmunk'; duration = 2};
	{id = 'ibis', patron = 'Ibis'; duration = 3, cycle = 7};
	{id = 'fox', patron = 'Fox'; duration = 3, cycle = 8};
	{id = 'cfox', patron = 'Cowled Fox'; duration = 3, cycle = 9};
	{id = 'tern', patron = 'Tern'; duration = 3, cycle = 3};
	{id = 'pilgrim', patron = 'Pilgrim'; duration = 3, cycle = 2};

	-- every 7 cycles, several extra signs occur in short succession
	{id = 'csteer', patron = 'Crowned Steer'; duration = 1, cycle = 7};
	{id = 'cmoose', patron = 'Crowned Moose'; duration = 1, cycle = 7};
	{id = 'cgoat', patron = 'Crowned Goat'; duration = 1, cycle = 7};
	{id = 'cweasel', patron = 'Crowned Weasel'; duration = 1, cycle = 7};
	{id = 'wolfprince', patron = 'Wolf-Prince'; duration = 2, cycle = 7};
}

Modified data/spells.lua from [c7b64d56d8] to [24333d0a0e].

391
392
393
394
395
396
397
















398
399
400
401
402
403
404
	obliterate = {
		name = 'obliteration';
		uses = 129;
		color = {175,6,212};
		affinity = {'aspen','dark'};
		leytype = 'occlutic';
		desc = 'Totally and irreversibly obliterate all items on an enchanter.';
















	};
	sacrifice = {
		name = 'sacrifice';
		uses = 58;
		color = {212,6,63};
		affinity = {'aspen','blazing'};
		leytype = 'syncretic';







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
	obliterate = {
		name = 'obliteration';
		uses = 129;
		color = {175,6,212};
		affinity = {'aspen','dark'};
		leytype = 'occlutic';
		desc = 'Totally and irreversibly obliterate all items on an enchanter.';
		cast = function(ctx)
			if not ctx.target or ctx.target.type ~= 'node' then return false end
			local tgt = minetest.get_node(ctx.target.under)
			if tgt.name ~= 'sorcery:enchanter' then return false end

			local inv = minetest.get_meta(ctx.target.under):get_inventory()
			for _,name in pairs{'foci','item'} do
				for i=1,inv:get_size(name) do
					inv:set_stack(name,i,ItemStack(nil))
				end
			end

			enchantment_sparkle(ctx,sorcery.lib.color(255,12,0))
			enchantment_sparkle(ctx,sorcery.lib.color(85,18,35))
			enchantment_sparkle(ctx,sorcery.lib.color(0,0,0))
		end
	};
	sacrifice = {
		name = 'sacrifice';
		uses = 58;
		color = {212,6,63};
		affinity = {'aspen','blazing'};
		leytype = 'syncretic';

Added data/transmutation.lua version [c466f67e6e].































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- transmutation is a mechanic whereby a metal can be sacrificed
-- at the enchanter by use of a transmutation wand to get another
-- metal unpredictably, possibly increasing in value, possibly
-- not.

return {
	gold = {
		[-2] = {'brass', 5};
		[-1] = {'silver', 3}; -- one chance in three of silver - undesirable
		[1] = {'lithium', 2};
		[2] = {'cobalt', 3};
		[3] = {'iridium', 50};
		fallback = 1;
	};
}

Modified depends.txt from [77f19ef08b] to [c1cf87f0b5].

3
4
5
6
7
8
9

farming
xdecor
basic_materials
vessels
late
instant_ores
screwdriver








>
3
4
5
6
7
8
9
10
farming
xdecor
basic_materials
vessels
late
instant_ores
screwdriver
hopper?

Modified disassembly.lua from [5366481e82] to [9a3b11da34].






























1
2
3
4
5


6
7
8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25

26
27
28
29
30
31
32
..
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
...
105
106
107
108
109
110
111
112
113

114
115
116







117
118
119
120
121
122
123
124
125
126


127
128
129
130
131
132
133





























local update_disassembler = function(pos)
	local m = minetest.get_meta(pos)
	local i = m:get_inventory()
	local paper = i:get_stack('paper',1)
	local item = i:get_stack('item',1)



	local ink_count
	for j=1,i:get_size('ink') do
		local ink = i:get_stack('ink',j)
		local c = ink:get_count()
		if ink_count then
			if c < ink_count then ink_count = c end
		else ink_count = c end
	end
	
	ink_count = ink_count or 0
	local maxrecs = math.min(ink_count, paper:get_count(), item:get_count())


	if maxrecs > 0 and sorcery.cookbook.classes.craft.find(item:get_name()) then
		local rec = ItemStack{name = 'sorcery:recipe', count = maxrecs}
		sorcery.cookbook.setrecipe(rec, 'craft', item:get_name())
		i:set_stack('output',1,rec)
	else
		i:set_stack('output',1,ItemStack())
	end

end
local dsbox = {
	type = 'fixed';
	fixed = {
		-0.5, -0.5, -0.5;
		 0.5,  0.0,  0.5;
	};
................................................................................
	};
	after_dig_node = sorcery.lib.node.purge_container;
	on_construct = function(pos)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()
		i:set_size('item',1)
		i:set_size('paper',1)
		i:set_size('ink',3)

		i:set_size('output',1)
		m:set_string('infotext','Disassembly Kit')
		m:set_string('formspec', [[
			formspec_version[3]
			size[10.25,7] real_coordinates[true]
			list[current_player;main;0.25,2;8,4]

			list[context;item;0.25,0.5;1,1;]
			list[context;paper;2.25,0.5;1,1;]
			list[context;ink;4.25,0.5;3,1;]
			list[context;output;9,0.5;1,1;]

			listring[context;output]
			listring[current_player;main] listring[context;paper]
			listring[current_player;main] listring[context;ink]
			listring[current_player;main] listring[context;item]
			listring[current_player;main]
		]])
	end;
	on_metadata_inventory_put = update_disassembler;
	on_metadata_inventory_take = function(pos,list,idx,stack,user)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()
		local paper = i:get_stack('paper',1)
		local item = i:get_stack('item',1)

		if list == 'output' then
			local count = stack:get_count()
			local leftover = sorcery.data.infusion_leftovers[item:get_name()]
			local lstack if leftover then
				lstack = ItemStack(leftover)
				lstack:set_count(lstack:get_count() * count)
				-- this slightly idiosyncratic code is used to ensure that
				-- itemstrings can be used in the infusion leftovers table
			end
			item:take_item(count)
			if item:get_count() > 0 then
				if leftover then
					lstack = user:get_inventory():add_item(lstack)
					if lstack:get_count() > 0 then minetest.add_item(pos,lstack) end
				end
................................................................................
			else
				if leftover then
					i:set_stack('item',1,lstack)
				else
					i:set_stack('item',1,ItemStack())
				end
			end
			for j=1,i:get_size('ink') do
				local ink = i:get_stack('ink',j)

				ink:take_item(count)
				i:set_stack('ink',j,ink)
			end







		end

		update_disassembler(pos)
	end;
	allow_metadata_inventory_put = function(pos,list,idx,stack,user)
		local name = stack:get_name()
		if list == 'paper' then
			if name == 'default:paper' then return stack:get_count() end
		elseif list == 'ink' then
			if minetest.get_item_group(name,'dye') > 0 then return stack:get_count() end


		elseif list == 'item' then
			return stack:get_count()
		elseif list == 'output' then
			return 0
		end
		return 0
	end;
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





>
>

|
<
<
<
<
<
<
<

<

>








>







 







|
>


<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<










|




|







 







<
|
>
|
|
|
>
>
>
>
>
>
>









|
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38







39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
..
80
81
82
83
84
85
86
87
88
89
90

91














92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
...
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
local disassembler_formspec = function(pos)
	local m = minetest.get_meta(pos)
	local i = m:get_inventory()
	local form = [[
		formspec_version[3]
		size[10.25,7] real_coordinates[true]
		list[current_player;main;0.25,2;8,4]
	]]
	local slot = function(name,x,y,ghost)
		local s = string.format('list[context;%s;%f,%f;1,1;]', name, x, y)
		if ghost and i:is_empty(name) then
			s = string.format('image[%f,%f;1,1;sorcery_ui_ghost_%s.png]',x,y,ghost) .. s
		end
		form = form .. s
	end
	slot('item',0.25,0.5)
	slot('paper',2.25,0.5,'paper')
	slot('ink',3.50,0.5,'ink_bottle')
	slot('pen',4.75,0.5,'pen')
	slot('output',9,0.5)
	form = form .. [[
		listring[context;output]
		listring[current_player;main] listring[context;paper]
		listring[current_player;main] listring[context;ink]
		listring[current_player;main] listring[context;item]
		listring[current_player;main]
	]]
	m:set_string('formspec',form)
end
local update_disassembler = function(pos)
	local m = minetest.get_meta(pos)
	local i = m:get_inventory()
	local paper = i:get_stack('paper',1)
	local item = i:get_stack('item',1)
	local ink = i:get_stack('ink',1)
	local pen = i:get_stack('pen',1)

	local ink_count = ink:get_count()







	

	local maxrecs = math.min(ink_count, paper:get_count(), item:get_count())
	if pen:is_empty() then maxrecs = 0 end

	if maxrecs > 0 and sorcery.cookbook.classes.craft.find(item:get_name()) then
		local rec = ItemStack{name = 'sorcery:recipe', count = maxrecs}
		sorcery.cookbook.setrecipe(rec, 'craft', item:get_name())
		i:set_stack('output',1,rec)
	else
		i:set_stack('output',1,ItemStack())
	end
	disassembler_formspec(pos)
end
local dsbox = {
	type = 'fixed';
	fixed = {
		-0.5, -0.5, -0.5;
		 0.5,  0.0,  0.5;
	};
................................................................................
	};
	after_dig_node = sorcery.lib.node.purge_container;
	on_construct = function(pos)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()
		i:set_size('item',1)
		i:set_size('paper',1)
		i:set_size('ink',1)
		i:set_size('pen',1)
		i:set_size('output',1)
		m:set_string('infotext','Disassembly Kit')

		disassembler_formspec(pos)














	end;
	on_metadata_inventory_put = update_disassembler;
	on_metadata_inventory_take = function(pos,list,idx,stack,user)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()
		local paper = i:get_stack('paper',1)
		local item = i:get_stack('item',1)

		if list == 'output' then
			local count = stack:get_count()
			local leftover = sorcery.register.residue.db[item:get_name()]
			local lstack if leftover then
				lstack = ItemStack(leftover)
				lstack:set_count(lstack:get_count() * count)
				-- this slightly idiosyncratic code is used to ensure that
				-- itemstrings can be used in the residue table
			end
			item:take_item(count)
			if item:get_count() > 0 then
				if leftover then
					lstack = user:get_inventory():add_item(lstack)
					if lstack:get_count() > 0 then minetest.add_item(pos,lstack) end
				end
................................................................................
			else
				if leftover then
					i:set_stack('item',1,lstack)
				else
					i:set_stack('item',1,ItemStack())
				end
			end

			local ink = i:get_stack('ink',1)
			local paper = i:get_stack('paper',1)
			ink:take_item(count)		paper:take_item(count)
			i:set_stack('ink',1,ink)	i:set_stack('paper',1,paper)
			local penstack = i:get_stack('pen',1)
			local pen = penstack:get_definition()._sorcery
			local uses = pen.material.data.durability * 0.10
			local dmg = 65535 / math.random(math.floor(uses*0.5),uses)
			print('adding damage',dmg,penstack:get_wear())
			penstack:add_wear(dmg)
			print('wear now',penstack:get_wear())
			i:set_stack('pen',1,penstack)
		end

		update_disassembler(pos)
	end;
	allow_metadata_inventory_put = function(pos,list,idx,stack,user)
		local name = stack:get_name()
		if list == 'paper' then
			if name == 'default:paper' then return stack:get_count() end
		elseif list == 'ink' then
			if minetest.get_item_group(name,'ink') > 0 then return stack:get_count() end
		elseif list == 'pen' then
			if minetest.get_item_group(name,'sorcery_pen') > 0 then return stack:get_count() end
		elseif list == 'item' then
			return stack:get_count()
		elseif list == 'output' then
			return 0
		end
		return 0
	end;

Modified gems.lua from [8e18232927] to [378fef1f36].

1
2
3
4
5
6
7
8
9
10
11
..
36
37
38
39
40
41
42








43
44
45
46
47
48
49
...
194
195
196
197
198
199
200
201

202
203
204
205
206
207
208
--- gemstones
local shards_per_gem = 9

sorcery.register_gem = function(name,gem)
	local itemname = gem.foreign or 'sorcery:gem_' .. name
	local shardname = gem.foreign_shard or 'sorcery:gem_' .. name .. '_shard'
	local amuletname = gem.foreign_amulet or 'sorcery:gem_' .. name .. '_amulet'

	sorcery.data.gems[name].parts = {
		item = itemname;
		shard = shardname;
................................................................................
			inventory_image = 'sorcery_gem_' .. name .. '_shard.png';
			groups = { gemshard = 1; crystalshard = 1; sorcery_shard = 1; };
			_sorcery = {
				material = {
					gem = true;
					id = name, data = gem;
					raw = true, value = 1;








				};
			};
		})
	end
	if not gem.foreign_amulet then
		minetest.register_craftitem(amuletname, {
			description = sorcery.lib.str.capitalize(name) .. ' amulet';
................................................................................
		minetest.override_item(ore, {drop = newdrops})
		-- might be possible to just edit it in place, since we're
		-- referring to registered_nodes anyway, but i don't want
		-- to chance it; god knows what's going on under the hood
	end
end

for g,v in pairs(sorcery.data.gems) do sorcery.register_gem(g,v) end


sorcery.gem = {
	getdrops = function(fac)
		items = {}
		for g,v in pairs(sorcery.data.gems) do
			items[#items + 1] = {
				rarity = gem.rarity * fac;



|







 







>
>
>
>
>
>
>
>







 







|
>







1
2
3
4
5
6
7
8
9
10
11
..
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
...
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
--- gemstones
local shards_per_gem = 9

local register_gem = function(name,gem)
	local itemname = gem.foreign or 'sorcery:gem_' .. name
	local shardname = gem.foreign_shard or 'sorcery:gem_' .. name .. '_shard'
	local amuletname = gem.foreign_amulet or 'sorcery:gem_' .. name .. '_amulet'

	sorcery.data.gems[name].parts = {
		item = itemname;
		shard = shardname;
................................................................................
			inventory_image = 'sorcery_gem_' .. name .. '_shard.png';
			groups = { gemshard = 1; crystalshard = 1; sorcery_shard = 1; };
			_sorcery = {
				material = {
					gem = true;
					id = name, data = gem;
					raw = true, value = 1;
				};
				recipe = {
					canonical = {
						craft = {
							{'','xdecor:hammer',''};
							{'',itemname,''};
						};
					}
				};
			};
		})
	end
	if not gem.foreign_amulet then
		minetest.register_craftitem(amuletname, {
			description = sorcery.lib.str.capitalize(name) .. ' amulet';
................................................................................
		minetest.override_item(ore, {drop = newdrops})
		-- might be possible to just edit it in place, since we're
		-- referring to registered_nodes anyway, but i don't want
		-- to chance it; god knows what's going on under the hood
	end
end

-- for g,v in pairs(sorcery.data.gems) do sorcery.register_gem(g,v) end
sorcery.register.gems.foreach('sorcery:generate',{},register_gem)

sorcery.gem = {
	getdrops = function(fac)
		items = {}
		for g,v in pairs(sorcery.data.gems) do
			items[#items + 1] = {
				rarity = gem.rarity * fac;

Modified gravitator.lua from [31896c5f81] to [8ccd951dd6].

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
		description = 'Gravitator';
		drop = 'sorcery:gravitator_off';
		paramtype2 = 'facedir';
		groups = {
			cracky = 2;
			sorcery_magitech = 1;
			sorcery_ley_device = 1;

			effect_trigger = (kind == 'off') and 0 or 1;
		};
		tiles = {
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';







|
|







27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
		description = 'Gravitator';
		drop = 'sorcery:gravitator_off';
		paramtype2 = 'facedir';
		groups = {
			cracky = 2;
			sorcery_magitech = 1;
			sorcery_ley_device = 1;
			not_in_creative_inventory = kind == 'off' and nil or 1;
			effect_trigger = (kind == 'off') and nil or 1;
		};
		tiles = {
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';
			'sorcery_gravitator_side.png';

Modified harvester.lua from [61997cebcf] to [de45db35b3].

91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
		]])
	end;
	on_metadata_inventory_put = update_inv;
	on_metadata_inventory_move = update_inv;

	_sorcery = {
		recipe = {
			info = "Standalone recharger for wands, amulets, and enchanted tools that draws on the ambient force from the local leylines";
		};
	};
})

minetest.register_craftitem('sorcery:harvester_receptacle', {
	description = 'Harvester Receptacle';
	inventory_image = 'sorcery_harvester_receptacle.png';







|







91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
		]])
	end;
	on_metadata_inventory_put = update_inv;
	on_metadata_inventory_move = update_inv;

	_sorcery = {
		recipe = {
			note = "Standalone recharger for wands, amulets, and enchanted tools that draws on the ambient force from the local leylines";
		};
	};
})

minetest.register_craftitem('sorcery:harvester_receptacle', {
	description = 'Harvester Receptacle';
	inventory_image = 'sorcery_harvester_receptacle.png';

Modified infuser.lua from [0d2fb4d9eb] to [13d8509748].

90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
			local base = potions[i]:get_name()
			local potion = potions[i]:get_definition()
			if elixir_can_apply(elixir,potion) then
				-- at least one combination makes a valid potion;
				-- we can start the infuser
				goto start
			end
			for _,v in pairs(sorcery.data.infusions) do
				if v.infuse == ingredient and v.into == base then
					-- at least one combination makes a valid
					-- potion; we can start the infuser
					goto start
				end
			end
		::skip:: end
................................................................................
					title = potion._proto.name .. ' Draught';
					desc = potion._proto.desc;
					color = sorcery.lib.color(potion._proto.color):readable();
					props = effects_table(newstack);
				});
				inv:set_stack('potions',i,discharge(newstack))
			else
				for _,v in pairs(sorcery.data.infusions) do
					if v.infuse == ingredient and v.into == base then
						-- transform the base into the infusion
						inv:set_stack('potions',i,discharge(ItemStack(v.output)))
					end
				end
			end
		::skip:: end

		inv:set_stack('infusion',1,ItemStack(sorcery.data.infusion_leftovers[ingredient]))

		infuser_stop(pos)
		return false
	else
		meta:set_float('runtime', newtime)
		meta:set_string('formspec', infuser_formspec(percent))
		meta:set_string('infotext', 'Infuser (active)')







|







 







|








|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
			local base = potions[i]:get_name()
			local potion = potions[i]:get_definition()
			if elixir_can_apply(elixir,potion) then
				-- at least one combination makes a valid potion;
				-- we can start the infuser
				goto start
			end
			for _,v in pairs(sorcery.register.infusions.db) do
				if v.infuse == ingredient and v.into == base then
					-- at least one combination makes a valid
					-- potion; we can start the infuser
					goto start
				end
			end
		::skip:: end
................................................................................
					title = potion._proto.name .. ' Draught';
					desc = potion._proto.desc;
					color = sorcery.lib.color(potion._proto.color):readable();
					props = effects_table(newstack);
				});
				inv:set_stack('potions',i,discharge(newstack))
			else
				for _,v in pairs(sorcery.register.infusions.db) do
					if v.infuse == ingredient and v.into == base then
						-- transform the base into the infusion
						inv:set_stack('potions',i,discharge(ItemStack(v.output)))
					end
				end
			end
		::skip:: end

		inv:set_stack('infusion',1,ItemStack(sorcery.register.residue.db[ingredient]))

		infuser_stop(pos)
		return false
	else
		meta:set_float('runtime', newtime)
		meta:set_string('formspec', infuser_formspec(percent))
		meta:set_string('infotext', 'Infuser (active)')

Modified init.lua from [330ca92ebf] to [f5b9efd3d5].

1
2
3
4
5


















6

7
8












9
10
11
12
13
14



15
16



17















18
19
20
21
22
23
24
25
26
27
28
29




30
31
32
33
34
35
36
37
38
39
40
41
42
43
44


45
46

47
48
49
50
51
52
53

54










55
56
57
58
59
60
61
62
63
64
65
66

67

do
	local path = minetest.get_modpath('sorcery');
	local get = function(unit)
		return dofile(path .. '/' .. unit .. '.lua')
	end


















	sorcery = {

		path = path;
		load = function(name) get(name) end;












		unit = function(ns,sfx)
			local target
			if ns then
				sorcery[ns] = {}
				target = sorcery[ns]
			else target = sorcery end



			return function(lst)
				for i=1,#lst do



					target[lst[i]] = get(((ns and ns..'/') or '')..lst[i])















				end
			end
		end;
	}
end

-- unfortunately we can't just iterate over the files
-- and load them automatically, as interdependencies
-- exist (especially with /lib) and we need to be very
-- careful about the order they're loaded in

sorcery.unit('data') {'ui'}




sorcery.unit('lib') {
	-- convenience
	'str';
	-- serialization
	'marshal', 'json';
	-- data structures
	'tbl', 'class';
	-- wrappers
	'color', 'image', 'ui';
	-- game
	'node';
}

sorcery.unit() { 'compat', 'matreg' }
sorcery.unit('data') {


	'compat';
	'affinities'; 'gods';

	'enchants', 'spells';
	'gems', 'metals';
	'potions', 'oils', 'greases',
		'draughts', 'elixirs',
		'philters', 'extracts';
	'register';
}












for _,u in pairs {
	'attunement'; 'context'; 'itemclass'; 'potions';
	'metal', 'gems'; 'leylines'; 'infuser'; 'altar';
	'wands'; 'tools', 'crafttools'; 'enchanter';
	'harvester'; 'metallurgy-hot', 'metallurgy-cold';
	'entities'; 'recipes'; 'coins'; 'interop';
	'tnodes'; 'forcefield'; 'farcaster'; 'portal';
	'cookbook', 'writing'; 'disassembly'; 'displacer';
	'gravitator';

	'admin';
} do sorcery.load(u) end








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>


>
>
>
>
>
>
>
>
>
>
>
>
|





>
>
>

<
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>











|
>
>
>
>













|
|
>
>
|
|
>
|
|
|
|
|
<
|
>

>
>
>
>
>
>
>
>
>
>








|



>

>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
do
	local path = minetest.get_modpath('sorcery');
	local get = function(unit)
		return dofile(path .. '/' .. unit .. '.lua')
	end
	local test = function(file) -- :/
		local hnd = io.open(file,'r')
		if hnd == nil then return false else
			hnd:close()
			return true
		end
	end
	local worldcfg = function(str)
		return minetest.get_worldpath() .. '/' .. str
	end
	local cfg = function(str) return worldcfg('sorcery/' .. str) end
	local selfname = minetest.get_current_modname()
	local stage = function(s,...)
		local f = sorcery.cfg(s .. '.lua')
		if test(f) then return loadfile(f)(...) or true end
		return false
	end

	sorcery = {
		self = selfname;
		path = path;
		load = function(name) get(name) end;
		worldcfg = worldcfg, cfg = cfg;
		stage = stage;
		log = function(module,text)
			if module then
				minetest.log('info',string.format('[%s :: %s] %s',selfname,module,text))
			else
				minetest.log('info',string.format('[%s] %s',selfname,text))
			end
		end;
		act = function(module,text)
			minetest.log('action',string.format('[%s :: %s] %s',selfname,module,text))
		end;
		unit = function(ns,sfx,override)
			local target
			if ns then
				sorcery[ns] = {}
				target = sorcery[ns]
			else target = sorcery end
			if override == true then override = ''
				elseif override then override = override .. '-' end
			local loaded = {}
			return function(lst)

				for i,name in pairs(lst) do
					if not loaded[name] then
						loaded[name] = true
						local fpath = ((ns and ns..'/') or '')..name
						local extra = cfg(string.format('%s%s-extra.lua', override,name))
						local replace = cfg(string.format('%s%s.lua', override,name))
						local default = get(fpath)
						if override and test(replace) then
							sorcery.log(name,'loading local replacement for ' .. fpath .. ' from ' .. replace)
							target[name] = loadfile(replace)(default)
						else
							target[name] = default
							if override and test(extra) then
								sorcery.log(name,'loading local extras for ' .. fpath .. ' from ' .. extra)
								local extbl = loadfile(extra)(default)
								for k,v in pairs(extbl) do target[name][k] = v end
							end
						end
					end
				end
			end
		end;
	}
end

-- unfortunately we can't just iterate over the files
-- and load them automatically, as interdependencies
-- exist (especially with /lib) and we need to be very
-- careful about the order they're loaded in

local data = sorcery.unit('data',nil,'lore')
local root = sorcery.unit()
sorcery.stage('bootstrap',data,root)

data {'ui'}
sorcery.unit('lib') {
	-- convenience
	'str';
	-- serialization
	'marshal', 'json';
	-- data structures
	'tbl', 'class';
	-- wrappers
	'color', 'image', 'ui';
	-- game
	'node';
}

sorcery.stage('worldbuilding',data,root)
root {'compat','matreg'}
if not sorcery.stage('loadlore', data, root) then
	data {
		'compat';
		'affinities'; 'gods';
		'calendar', 'signs';
		'enchants', 'spells';
		'gems', 'metals';
		'potions', 'oils', 'greases',
			'draughts', 'elixirs',
			'philters', 'extracts';

	}
end

sorcery.load('registration') do
	local exclude = {'compat','ui'}
	for k,v in pairs(sorcery.data) do
		if not sorcery.lib.tbl.has(exclude,k) then
			sorcery.registry.mk(k,v)
		end
	end
end

sorcery.stage('startup',data)
for _,u in pairs {
	'attunement'; 'context'; 'itemclass'; 'potions';
	'metal', 'gems'; 'leylines'; 'infuser'; 'altar';
	'wands'; 'tools', 'crafttools'; 'enchanter';
	'harvester'; 'metallurgy-hot', 'metallurgy-cold';
	'entities'; 'recipes'; 'coins'; 'interop';
	'tnodes'; 'forcefield'; 'farcaster'; 'portal';
	'cookbook', 'writing'; 'disassembly'; 'displacer';
	'gravitator'; 'precipitator'; 'astrolabe';

	'admin';
} do sorcery.load(u) end
sorcery.stage('finalize')

sorcery.registry.defercheck()

Modified itemclass.lua from [25dadd17e3] to [56d754e26c].

108
109
110
111
112
113
114

115
116
117
118
119
120
121
			end;
		};
	};
	get = function(name,class)
		local c = sorcery.itemclass.classes[class]
		local o
		if not c then return false end


		if c.predicate then 
			o = c.predicate(name)
			if o then return o end
		end

		if c.compat then







>







108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
			end;
		};
	};
	get = function(name,class)
		local c = sorcery.itemclass.classes[class]
		local o
		if not c then return false end
		if type(name) ~= 'string' then name = name:get_name() end

		if c.predicate then 
			o = c.predicate(name)
			if o then return o end
		end

		if c.compat then

Modified leylines.lua from [58178ad533] to [110ec2eec9].

699
700
701
702
703
704
705



706


707
708
709
710
711
712
713
	]], math.floor(burnprog * 100)) .. lamps)
end
for _,active in pairs{true,false} do
	local id = 'sorcery:generator' .. (active and '_active' or '')
	minetest.register_node(id, {
		description = 'Generator';
		paramtype2 = 'facedir';



		groups = { cracky = 2; sorcery_ley_device = 1; sorcery_device_generator = active and 1 or 2};


		drop = 'sorcery:generator';
		tiles = {
			'sorcery_ley_generator_top.png';
			'sorcery_ley_generator_bottom.png';
			'sorcery_ley_generator_side.png';
			'sorcery_ley_generator_side.png';
			'sorcery_ley_generator_back.png';







>
>
>
|
>
>







699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
	]], math.floor(burnprog * 100)) .. lamps)
end
for _,active in pairs{true,false} do
	local id = 'sorcery:generator' .. (active and '_active' or '')
	minetest.register_node(id, {
		description = 'Generator';
		paramtype2 = 'facedir';
		groups = {
			cracky = 2;
			sorcery_ley_device = 1;
			sorcery_device_generator = active and 1 or 2;
			not_in_creative_inventory = active and nil or 1;
		};
		drop = 'sorcery:generator';
		tiles = {
			'sorcery_ley_generator_top.png';
			'sorcery_ley_generator_bottom.png';
			'sorcery_ley_generator_side.png';
			'sorcery_ley_generator_side.png';
			'sorcery_ley_generator_back.png';

Modified lib/str.lua from [e883d78392] to [64ce434f04].

9
10
11
12
13
14
15












16
17
18
19
20
21
22
	['\xf2'] = '\2';
	['\xf3'] = '\3';
}
return {
	capitalize = function(str)
		return string.upper(string.sub(str, 1,1)) .. string.sub(str, 2)
	end;













	rand = function(min,max)
		if not min then min = 16  end
		if not max then max = min end
		local str = ''
		local r_int   =            0x39 - 0x30
		local r_upper = r_int   + (0x5a - 0x41)







>
>
>
>
>
>
>
>
>
>
>
>







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
	['\xf2'] = '\2';
	['\xf3'] = '\3';
}
return {
	capitalize = function(str)
		return string.upper(string.sub(str, 1,1)) .. string.sub(str, 2)
	end;

	explode = function(str,delim)
		local i = 1
		local tbl = {}
		repeat
			local ss = string.sub(str, i)
			local d = string.find(ss, delim, 1, true) or string.len(ss)+1
			tbl[#tbl+1] = string.sub(ss,1,d-1)
			i = i + d 
		until i > string.len(str)
		return tbl
	end;

	rand = function(min,max)
		if not min then min = 16  end
		if not max then max = min end
		local str = ''
		local r_int   =            0x39 - 0x30
		local r_upper = r_int   + (0x5a - 0x41)

Modified lib/tbl.lua from [5046584198] to [4e80a60df8].

15
16
17
18
19
20
21












22
23
24
25
26
















27
28
29
30
31
32
33
...
105
106
107
108
109
110
111
112












113

fn.copy = function(t)
	local new = {}
	for i,v in pairs(t) do new[i] = v end
	setmetatable(new,getmetatable(t))
	return new
end













fn.merge = function(base,override)
	local new = fn.copy(base)
	for k,v in pairs(override) do
		new[k] = v
















	end
	return new
end

fn.append = function(r1, r2)
	local new = fn.copy(r1)
	for i=1,#r2 do
................................................................................
	else
		for i=0,#tbl do
			acc = fn(acc,tbl[i],i)
		end
	end
	return acc
end













return fn







>
>
>
>
>
>
>
>
>
>
>
>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 








>
>
>
>
>
>
>
>
>
>
>
>

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

fn.copy = function(t)
	local new = {}
	for i,v in pairs(t) do new[i] = v end
	setmetatable(new,getmetatable(t))
	return new
end

fn.deepcopy = table.copy or function(t)
	new = {}
	for k,v in pairs(t) do
		if type(v) == 'table' then
			new[k] = fn.deepcopy(v)
		else
			new[k] = v
		end
	end
	return new
end

fn.merge = function(base,override)
	local new = fn.copy(base)
	for k,v in pairs(override) do
		new[k] = v
	end
	return new
end

fn.deepmerge = function(base,override)
	local new = {}
	local keys = fn.merge(fn.keys(base),fn.keys(override))
	for _,k in pairs(keys) do
		if type(base[k]) == 'table' and
		   type(override[k]) == 'table' then
			new[k] = fn.deepmerge(base[k], override[k])
		elseif override[k] then
			new[k] = override[k]
		else
			new[k] = base[k]
		end
	end
	return new
end

fn.append = function(r1, r2)
	local new = fn.copy(r1)
	for i=1,#r2 do
................................................................................
	else
		for i=0,#tbl do
			acc = fn(acc,tbl[i],i)
		end
	end
	return acc
end

fn.walk = function(tbl,path)
	if type(path) == 'table' then
		for _,p in pairs(path) do
			if tbl[p] == nil then return nil end
			tbl = tbl[p]
		end
	else
		tbl = tbl[path]
	end
	return tbl
end

return fn

Added lore.md version [044261e67c].





>
>
1
2
# sorcery default lore
while individual worlds can can modify, augment, or replace it, sorcery comes with a default 'lorepack' (set of data interpreted by the mod mechanics). this is a minimal guide designed to get you started exploring it, and for developers to give them a sense of how the lore data is interpreted and what is done with it. the lore itself is purposely *not* exhaustively documented, as figuring out what you can do and writing in-game books on the topic is meant to be a core social mechanic!

Modified metal.lua from [32259e26c1] to [f9db217ceb].

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
..
37
38
39
40
41
42
43
44

45
46
47
48
49
50
51
..
76
77
78
79
80
81
82
83
84
85
86
87
88
89







90
91
92
93
94
95
96
...
140
141
142
143
144
145
146







147
148
149
150
151
152
153
...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
	name = "sorcery:delete_duranium_ore_again";
	nodenames = {'sorcery:stone_with_duranium'};
	action = function(pos,node)
		minetest.set_node(pos, {name = 'default:stone'})
	end
}

sorcery.data.alloys = {}
sorcery.data.kilnrecs = {}
sorcery.data.metallookup = {
	-- compat bullshit
	['moreores:silver_ingot'] = {
		id = 'silver'; data = sorcery.data.metals.silver;
		value = fragments_per_ingot;
	};
	['moreores:silver_block'] = {
................................................................................
	['morelights_vintage:brass_block'] = {
		id = 'brass'; data = sorcery.data.metals.brass;
		value = fragments_per_ingot * 9;
	};
}

local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors
for name, metal in pairs(sorcery.data.metals) do

	local ingot = metal.ingot or 'sorcery:' .. name .. '_ingot'
	local block = metal.block or 'sorcery:' .. name .. 'block'
	local screw = 'sorcery:screw_' .. name
	local fragment = 'sorcery:fragment_' .. name
	local powder = 'sorcery:powder_' .. name
	metal.parts = {
		ingot = ingot;
................................................................................
		id = name; data = metal;
		value = fragments_per_ingot * 9;
	}
	sorcery.data.metallookup[fragment] = {
		id = name; data = metal;
		value = 1;
	}
	sorcery.data.metallookup[screw] = {
		id = name; data = metal;
		value = 0; -- prevent use in smelting
	}
	minetest.register_craftitem(screw, {
		description = sorcery.lib.str.capitalize(name) .. ' Screw';
		inventory_image = sorcery.lib.image('sorcery_screw.png'):multiply(sorcery.lib.color(metal.tone)):render();







	})
	minetest.register_craftitem(powder, {
		description = sorcery.lib.str.capitalize(name) .. ' Powder';
		inventory_image = 'sorcery_' .. name .. '_powder.png';
	})
	if metal.dye then
		minetest.register_craft {
................................................................................
			armor_weight = metal.armor_weight;
			armor_protection = metal.armor_protection;
		}
	end
	minetest.register_craftitem(fragment, {
		inventory_image = 'sorcery_' .. name .. '_fragment.png';
		description = sorcery.lib.str.capitalize(name) .. ' Fragment';







	})
	minetest.register_craft {
		type = 'cooking';
		recipe = powder;
		cooktime = (metal.cooktime or 4) * 0.25;
		output = fragment;
	}
................................................................................
		minetest.register_craft {
			type = 'fuel';
			recipe = powder;
			burntime = metal.fuel;
		}
	end
	if metal.mix then
		sorcery.data.register.alloy(sorcery.lib.tbl.merge(metal.mix, {
			output = name;
			cooktime = metal.cooktime or 10;
		}))
	end
	if metal.sinter then
		local powders = {}
		for _,m in pairs(metal.sinter) do
			powders[#powders+1] = 'sorcery:powder_' .. m
		end
		local repl = {}
		if metal.sinter_catalyst then
			for _,m in pairs(metal.sinter_catalyst) do
				powders[#powders+1] = m
				if sorcery.data.infusion_leftovers[m] then
					repl[#repl+1] = {m, sorcery.data.infusion_leftovers[m]}
				end
			end
		end

		minetest.register_craft {
			type = 'shapeless';
			output = powder .. ' ' .. tostring(#powders);
			recipe = powders;
			replacements = repl;
		};
	end
end







|
|







 







|
>







 







<
<
<
<



>
>
>
>
>
>
>







 







>
>
>
>
>
>
>







 







|













|
|











|
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
..
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
..
77
78
79
80
81
82
83




84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
	name = "sorcery:delete_duranium_ore_again";
	nodenames = {'sorcery:stone_with_duranium'};
	action = function(pos,node)
		minetest.set_node(pos, {name = 'default:stone'})
	end
}

sorcery.registry.mk('alloys',false)
sorcery.registry.mk('kilnrecs',false)
sorcery.data.metallookup = {
	-- compat bullshit
	['moreores:silver_ingot'] = {
		id = 'silver'; data = sorcery.data.metals.silver;
		value = fragments_per_ingot;
	};
	['moreores:silver_block'] = {
................................................................................
	['morelights_vintage:brass_block'] = {
		id = 'brass'; data = sorcery.data.metals.brass;
		value = fragments_per_ingot * 9;
	};
}

local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors
-- for name, metal in pairs(sorcery.data.metals) do
sorcery.register.metals.foreach('sorcery:generate',{},function(name,metal)
	local ingot = metal.ingot or 'sorcery:' .. name .. '_ingot'
	local block = metal.block or 'sorcery:' .. name .. 'block'
	local screw = 'sorcery:screw_' .. name
	local fragment = 'sorcery:fragment_' .. name
	local powder = 'sorcery:powder_' .. name
	metal.parts = {
		ingot = ingot;
................................................................................
		id = name; data = metal;
		value = fragments_per_ingot * 9;
	}
	sorcery.data.metallookup[fragment] = {
		id = name; data = metal;
		value = 1;
	}




	minetest.register_craftitem(screw, {
		description = sorcery.lib.str.capitalize(name) .. ' Screw';
		inventory_image = sorcery.lib.image('sorcery_screw.png'):multiply(sorcery.lib.color(metal.tone)):render();
		_sorcery = {
			material = {
				id = name, data = metal;
				grindcost = 2, grindvalue = 1;
				value = 0.5;
			};
		};
	})
	minetest.register_craftitem(powder, {
		description = sorcery.lib.str.capitalize(name) .. ' Powder';
		inventory_image = 'sorcery_' .. name .. '_powder.png';
	})
	if metal.dye then
		minetest.register_craft {
................................................................................
			armor_weight = metal.armor_weight;
			armor_protection = metal.armor_protection;
		}
	end
	minetest.register_craftitem(fragment, {
		inventory_image = 'sorcery_' .. name .. '_fragment.png';
		description = sorcery.lib.str.capitalize(name) .. ' Fragment';
		_sorcery = {
			recipe = {
				canonical = {
					cook = {{ingot}};
				};
			};
		};
	})
	minetest.register_craft {
		type = 'cooking';
		recipe = powder;
		cooktime = (metal.cooktime or 4) * 0.25;
		output = fragment;
	}
................................................................................
		minetest.register_craft {
			type = 'fuel';
			recipe = powder;
			burntime = metal.fuel;
		}
	end
	if metal.mix then
		sorcery.register.alloys.link(sorcery.lib.tbl.merge(metal.mix, {
			output = name;
			cooktime = metal.cooktime or 10;
		}))
	end
	if metal.sinter then
		local powders = {}
		for _,m in pairs(metal.sinter) do
			powders[#powders+1] = 'sorcery:powder_' .. m
		end
		local repl = {}
		if metal.sinter_catalyst then
			for _,m in pairs(metal.sinter_catalyst) do
				powders[#powders+1] = m
				if sorcery.register.residue.db[m] then
					repl[#repl+1] = {m, sorcery.register.residue.db[m]}
				end
			end
		end

		minetest.register_craft {
			type = 'shapeless';
			output = powder .. ' ' .. tostring(#powders);
			recipe = powders;
			replacements = repl;
		};
	end
end)

Modified metallurgy-cold.lua from [c145d6a94a] to [0187673a26].

79
80
81
82
83
84
85



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

103
104
105
106
107
108


109
110
111
112

113
114
115
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130
131
132
133
...
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
	minetest.get_node_timer(pos):start(constants.mill_refresh)
end
local mill_fits_in_slot = function(slot,item)
	if slot == 'grinder' then
		if minetest.get_item_group(item:get_name(), 'sorcery_mill_grindhead')~=0 
			then return 1 end
	elseif slot == 'input' then



		local metal = sorcery.data.metallookup[item:get_name()]
		local mat = sorcery.matreg.lookup[item:get_name()]
		local comp = sorcery.data.compat.grindables[item:get_name()]
		if metal or (mat and mat.metal) or comp then
			return item:get_count()
		else
			mat = item:get_definition()._sorcery and
			      item:get_definition()._sorcery.material
			if mat and mat.grindvalue then
				return item:get_count() 
			end
		end
	end
	return 0
end
local matprops = function(item)
	local metal = sorcery.data.metallookup[item:get_name()]

	if not metal then
		-- allow grinding of armor and tools back to their
		-- original components
		local mat = sorcery.matreg.lookup[item:get_name()]
		if mat and mat.metal then
			metal = mat


		end
	end
	local mp = (item:get_definition()._sorcery and
		item:get_definition()._sorcery.material)

		or sorcery.data.compat.grindables[item:get_name()]
		or {}

	if metal then mp = {
		hardness = mp.hardness or metal.data.hardness;
		grindvalue = ((mp.grindvalue or metal.value) or (metal and constants.metal_grindvalue));
		powder = mp.powder or metal.data.parts.powder;
		grindcost = mp.grindcost or constants.metal_grindcost; -- invariant for metal
	} end


	mp.torque     = constants.grind_torque_factor * mp.hardness
	mp.grindvalue = mp.grindvalue or constants.default_grindvalue
	mp.grindcost  = mp.grindcost  or constants.default_grindcost
	mp.hardness   = mp.hardness   or constants.default_hardness;

	if item:get_wear() ~= 0 then
		-- prevent cheating by recovering metal from items before they
		-- are destroyed
		local wearfac = (item:get_wear() / 65535)
		mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac))
		mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac))
................................................................................
				local speedboost = math.max(0.05,((grindpower - mp.hardness)/constants.grind_range) * grinders)
				reqtime = mp.grindvalue * mp.hardness * constants.grind_factor * (1-speedboost)
				if elapsed >= reqtime then
					item:take_item(mp.grindcost)
					inv:set_stack('input',1,item)
					local pw = ItemStack{
						name=mp.powder;
						count=mp.grindvalue;
					}
					if inv:room_for_item('output',pw) then
						inv:add_item('output',pw)
					else
						minetest.add_item(pos,pw)
					end
					elapsed = 0







>
>
>
|
|
|
|
|
|
|
|
|
|
|
|





>






>
>


<
<
>










>



<







 







|







79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116


117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

132
133
134
135
136
137
138
...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
	minetest.get_node_timer(pos):start(constants.mill_refresh)
end
local mill_fits_in_slot = function(slot,item)
	if slot == 'grinder' then
		if minetest.get_item_group(item:get_name(), 'sorcery_mill_grindhead')~=0 
			then return 1 end
	elseif slot == 'input' then
		if sorcery.itemclass.get(item,'grindable') then
			return item:get_count()
		end
		-- local metal = sorcery.data.metallookup[item:get_name()]
		-- local mat = sorcery.matreg.lookup[item:get_name()]
		-- local comp = sorcery.data.compat.grindables[item:get_name()]
		-- if metal or (mat and mat.metal) or comp then
		-- 	return item:get_count()
		-- else
		-- 	mat = item:get_definition()._sorcery and
		-- 	      item:get_definition()._sorcery.material
		-- 	if mat and mat.metal or mat.powder then
		-- 		return item:get_count() 
		-- 	end
		-- end
	end
	return 0
end
local matprops = function(item)
	local metal = sorcery.data.metallookup[item:get_name()]
	local props = item:get_definition()._sorcery
	if not metal then
		-- allow grinding of armor and tools back to their
		-- original components
		local mat = sorcery.matreg.lookup[item:get_name()]
		if mat and mat.metal then
			metal = mat
		elseif props and props.material and props.material.metal then
			metal = props.material
		end
	end


	local mp = (props and props.material)
		or sorcery.data.compat.grindables[item:get_name()]
		or {}

	if metal then mp = {
		hardness = mp.hardness or metal.data.hardness;
		grindvalue = ((mp.grindvalue or metal.value) or (metal and constants.metal_grindvalue));
		powder = mp.powder or metal.data.parts.powder;
		grindcost = mp.grindcost or constants.metal_grindcost; -- invariant for metal
	} end

	mp.hardness   = mp.hardness   or constants.default_hardness;
	mp.torque     = constants.grind_torque_factor * mp.hardness
	mp.grindvalue = mp.grindvalue or constants.default_grindvalue
	mp.grindcost  = mp.grindcost  or constants.default_grindcost


	if item:get_wear() ~= 0 then
		-- prevent cheating by recovering metal from items before they
		-- are destroyed
		local wearfac = (item:get_wear() / 65535)
		mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac))
		mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac))
................................................................................
				local speedboost = math.max(0.05,((grindpower - mp.hardness)/constants.grind_range) * grinders)
				reqtime = mp.grindvalue * mp.hardness * constants.grind_factor * (1-speedboost)
				if elapsed >= reqtime then
					item:take_item(mp.grindcost)
					inv:set_stack('input',1,item)
					local pw = ItemStack{
						name=mp.powder;
						count=math.floor(mp.grindvalue);
					}
					if inv:room_for_item('output',pw) then
						inv:add_item('output',pw)
					else
						minetest.add_item(pos,pw)
					end
					elapsed = 0

Modified metallurgy-hot.lua from [c9beb59240] to [52848574bf].

128
129
130
131
132
133
134




135
136
137
138

139
140
141
142
143
144
145
146
147
148
149
150
...
208
209
210
211
212
213
214















215
216
217
218
219
220
221
222
223
224

225
226
227
228
229
230
231
...
302
303
304
305
306
307
308

309
310
311
312
313
314
315
...
384
385
386
387
388
389
390

391
392
393
394
395
396
397
local find_recipe = function(inv)
	local mix = {}
	local count = 0
	for i=1,inv:get_size('input') do
		local m = inv:get_stack('input',i)
		if m:is_empty() then goto skip end
		local l = sorcery.data.metallookup[m:get_name()]




		if not l then return false end
		mix[l.id] = (mix[l.id] or 0) + l.value
		count = count + l.value
	::skip::end

	-- everything is metal, we've finished summing it up.
	-- let's see if the assembled items match the ratio
	-- specified in any of the smelting recipes.
	local matches = 0
	for _,rec in pairs(sorcery.data.alloys) do
		local fac = nil
		local meltpoint = 1
		if rec.metals == nil then goto skip_recipe end
		for metal, ratio in pairs(rec.metals) do
			if mix[metal] and mix[metal] % ratio == 0 then
				if fac then
					if mix[metal] / ratio ~= fac then goto skip_recipe end
................................................................................
		for i=1,inv:get_size('input') do
			local s = inv:get_stack('input',i)
			if s:is_empty() then goto skip end
			s:take_item(1) inv:set_stack('input',i,s)
		::skip::end

		local outstack















		if count % fragments_per_ingot == 0 then
			outstack = ItemStack {
				name = sorcery.data.metals[recipe.output].ingot or 'sorcery:' .. recipe.output .. '_ingot';
				count = count / fragments_per_ingot;
			}
		else
			outstack = ItemStack {
				name = 'sorcery:fragment_' .. recipe.output;
				count = count;
			}

		end

		local leftover = inv:add_item('output',outstack)
		if not leftover:is_empty() then
			minetest.add_item(pos, leftover)
		end
	end
................................................................................
			drawtype = "mesh";
			after_dig_node = sorcery.lib.node.purge_container;
			mesh = 'sorcery-kiln-' .. state .. '.obj';
			drop = id;
			groups = {
				cracky = (state == 'open' and 2) or nil;
				sorcery_metallurgy = 1;

			};
			sunlight_propagates = true;
			paramtype1 = 'light';
			paramtype2 = 'facedir';
			selection_box = box[state];
			collision_box = box[state];
			tiles = tex[state];
................................................................................
			_proto = kind;
			description = desc;
			drop = id;
			after_dig_node = sorcery.lib.node.purge_container;
			groups = {
				cracky = (active and 2) or nil;
				sorcery_metallurgy = 1;

			};
			paramtype2 = 'facedir';
			light_source = (active and 9) or 0;
			on_construct = function(pos)
				local meta = minetest.get_meta(pos)
				local inv = meta:get_inventory()
				inv:set_size('input',kind.size)







>
>
>
>




>




|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
>







 







>







 







>







128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
...
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
local find_recipe = function(inv)
	local mix = {}
	local count = 0
	for i=1,inv:get_size('input') do
		local m = inv:get_stack('input',i)
		if m:is_empty() then goto skip end
		local l = sorcery.data.metallookup[m:get_name()]
		if not l then
			local p = sorcery.lib.tbl.walk(m:get_definition()._sorcery,{'material'})
			if p.metal then l = p end
		end
		if not l then return false end
		mix[l.id] = (mix[l.id] or 0) + l.value
		count = count + l.value
	::skip::end
	count = math.floor(count)
	-- everything is metal, we've finished summing it up.
	-- let's see if the assembled items match the ratio
	-- specified in any of the smelting recipes.
	local matches = 0
	for _,rec in pairs(sorcery.register.alloys.db) do
		local fac = nil
		local meltpoint = 1
		if rec.metals == nil then goto skip_recipe end
		for metal, ratio in pairs(rec.metals) do
			if mix[metal] and mix[metal] % ratio == 0 then
				if fac then
					if mix[metal] / ratio ~= fac then goto skip_recipe end
................................................................................
		for i=1,inv:get_size('input') do
			local s = inv:get_stack('input',i)
			if s:is_empty() then goto skip end
			s:take_item(1) inv:set_stack('input',i,s)
		::skip::end

		local outstack
		if type(output) == 'table' then
			for v,item in pairs(output) do
				if count % v == 0 then
					outstack = ItemStack {
						name = item;
						count = count / v;
					}
				end
			end
		else
			if count % (fragments_per_ingot * 9) == 0 then
				outstack = ItemStack {
					name = sorcery.data.metals[recipe.output].parts.block;
					count = count / (fragments_per_ingot*9);
				}
			elseif count % fragments_per_ingot == 0 then
				outstack = ItemStack {
					name = sorcery.data.metals[recipe.output].parts.ingot;
					count = count / fragments_per_ingot;
				}
			else
				outstack = ItemStack {
					name = 'sorcery:fragment_' .. recipe.output;
					count = count;
				}
			end
		end

		local leftover = inv:add_item('output',outstack)
		if not leftover:is_empty() then
			minetest.add_item(pos, leftover)
		end
	end
................................................................................
			drawtype = "mesh";
			after_dig_node = sorcery.lib.node.purge_container;
			mesh = 'sorcery-kiln-' .. state .. '.obj';
			drop = id;
			groups = {
				cracky = (state == 'open' and 2) or nil;
				sorcery_metallurgy = 1;
				not_in_creative_inventory = (state == open) and nil or 1;
			};
			sunlight_propagates = true;
			paramtype1 = 'light';
			paramtype2 = 'facedir';
			selection_box = box[state];
			collision_box = box[state];
			tiles = tex[state];
................................................................................
			_proto = kind;
			description = desc;
			drop = id;
			after_dig_node = sorcery.lib.node.purge_container;
			groups = {
				cracky = (active and 2) or nil;
				sorcery_metallurgy = 1;
				not_in_creative_inventory = active and 1 or nil;
			};
			paramtype2 = 'facedir';
			light_source = (active and 9) or 0;
			on_construct = function(pos)
				local meta = minetest.get_meta(pos)
				local inv = meta:get_inventory()
				inv:set_size('input',kind.size)

Added models/sorcery-astrolabe.obj version [d217d918f2].











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
# Blender v2.82 (sub 7) OBJ File: 'astrolabe.blend'
# www.blender.org
mtllib sorcery-astrolabe.mtl
o steel
v -0.031600 0.038922 -0.405254
v -0.110054 0.038922 -0.391303
v -0.184278 0.038922 -0.362313
v -0.251421 0.038922 -0.319401
v -0.308902 0.038922 -0.264214
v -0.354512 0.038922 -0.198873
v -0.386499 0.038922 -0.125890
v -0.403632 0.038922 -0.048069
v -0.405254 0.038922 0.031599
v -0.391302 0.038922 0.110053
v -0.362313 0.038922 0.184278
v -0.319401 0.038922 0.251421
v -0.264214 0.038922 0.308902
v -0.198873 0.038922 0.354512
v -0.125890 0.038922 0.386498
v -0.048069 0.038922 0.403632
v 0.031600 0.038922 0.405254
v 0.110054 0.038922 0.391302
v 0.184278 0.038922 0.362313
v 0.251421 0.038922 0.319400
v 0.308902 0.038922 0.264213
v 0.354512 0.038922 0.198873
v 0.386498 0.038922 0.125889
v 0.403632 0.038922 0.048068
v 0.405254 0.038922 -0.031600
v 0.391302 0.038922 -0.110054
v 0.362313 0.038922 -0.184279
v 0.319400 0.038922 -0.251422
v 0.264213 0.038922 -0.308903
v 0.198872 0.038922 -0.354513
v 0.125889 0.038922 -0.386499
v 0.048068 0.038922 -0.403632
v -0.031600 -0.038922 -0.405254
v -0.110054 -0.038922 -0.391303
v -0.184278 -0.038922 -0.362313
v -0.251421 -0.038922 -0.319401
v -0.308902 -0.038922 -0.264214
v -0.354512 -0.038922 -0.198873
v -0.386499 -0.038922 -0.125890
v -0.403632 -0.038922 -0.048069
v -0.405254 -0.038922 0.031599
v -0.391302 -0.038922 0.110053
v -0.362313 -0.038922 0.184278
v -0.319401 -0.038922 0.251421
v -0.264214 -0.038922 0.308902
v -0.198873 -0.038922 0.354512
v -0.125890 -0.038922 0.386498
v -0.048069 -0.038922 0.403632
v 0.031600 -0.038922 0.405254
v 0.110054 -0.038922 0.391302
v 0.184278 -0.038922 0.362313
v 0.251421 -0.038922 0.319400
v 0.308902 -0.038922 0.264213
v 0.354512 -0.038922 0.198873
v 0.386498 -0.038922 0.125889
v 0.403632 -0.038922 0.048068
v 0.405254 -0.038922 -0.031600
v 0.391302 -0.038922 -0.110054
v 0.362313 -0.038922 -0.184279
v 0.319400 -0.038922 -0.251422
v 0.264213 -0.038922 -0.308903
v 0.198872 -0.038922 -0.354513
v 0.125889 -0.038922 -0.386499
v 0.048068 -0.038922 -0.403632
v -0.036264 0.038922 -0.465073
v -0.126297 0.038922 -0.449061
v -0.211478 0.038922 -0.415792
v -0.288532 0.038922 -0.366545
v -0.354497 0.038922 -0.303212
v -0.406839 0.038922 -0.228228
v -0.443547 0.038922 -0.144472
v -0.463210 0.038922 -0.055163
v -0.465072 0.038922 0.036264
v -0.449061 0.038922 0.126297
v -0.415792 0.038922 0.211478
v -0.366545 0.038922 0.288532
v -0.303212 0.038922 0.354497
v -0.228228 0.038922 0.406839
v -0.144471 0.038922 0.443547
v -0.055163 0.038922 0.463210
v 0.036264 0.038922 0.465070
v 0.126297 0.038922 0.449061
v 0.211478 0.038922 0.415792
v 0.288532 0.038922 0.366545
v 0.354497 0.038922 0.303212
v 0.406839 0.038922 0.228227
v 0.443547 0.038922 0.144471
v 0.463210 0.038922 0.055163
v 0.465072 0.038922 -0.036264
v 0.449061 0.038922 -0.126298
v 0.415792 0.038922 -0.211479
v 0.366545 0.038922 -0.288532
v 0.303212 0.038922 -0.354497
v 0.228227 0.038922 -0.406840
v 0.144471 0.038922 -0.443547
v 0.055162 0.038922 -0.463210
v -0.036264 -0.038922 -0.465073
v -0.126297 -0.038922 -0.449061
v -0.211478 -0.038922 -0.415792
v -0.288532 -0.038922 -0.366545
v -0.354497 -0.038922 -0.303212
v -0.406839 -0.038922 -0.228228
v -0.443547 -0.038922 -0.144472
v -0.463210 -0.038922 -0.055163
v -0.465072 -0.038922 0.036264
v -0.449061 -0.038922 0.126297
v -0.415792 -0.038922 0.211478
v -0.366545 -0.038922 0.288532
v -0.303212 -0.038922 0.354497
v -0.228228 -0.038922 0.406839
v -0.144471 -0.038922 0.443547
v -0.055163 -0.038922 0.463210
v 0.036264 -0.038922 0.465070
v 0.126297 -0.038922 0.449061
v 0.211478 -0.038922 0.415792
v 0.288532 -0.038922 0.366545
v 0.354497 -0.038922 0.303212
v 0.406839 -0.038922 0.228227
v 0.443547 -0.038922 0.144471
v 0.463210 -0.038922 0.055163
v 0.465072 -0.038922 -0.036264
v 0.449061 -0.038922 -0.126298
v 0.415792 -0.038922 -0.211479
v 0.366545 -0.038922 -0.288532
v 0.303212 -0.038922 -0.354497
v 0.228227 -0.038922 -0.406840
v 0.144471 -0.038922 -0.443547
v 0.055162 -0.038922 -0.463210
v -0.010652 0.019986 0.329882
v 0.034390 0.065822 0.322211
v 0.077602 0.109626 0.302151
v 0.117323 0.149716 0.270472
v 0.152028 0.184550 0.228394
v 0.180382 0.212791 0.177531
v 0.201296 0.233352 0.119839
v 0.213966 0.245444 0.057536
v 0.217905 0.248602 -0.006985
v 0.212963 0.242705 -0.071245
v 0.199328 0.227979 -0.132773
v 0.177525 0.204990 -0.189206
v 0.148391 0.174621 -0.238374
v 0.113047 0.138041 -0.278388
v 0.072850 0.096653 -0.307710
v 0.029346 0.052050 -0.325214
v -0.015795 0.005945 -0.330227
v -0.060836 -0.039891 -0.322556
v -0.104048 -0.083695 -0.302496
v -0.143769 -0.123785 -0.270817
v -0.178474 -0.158620 -0.228739
v -0.206828 -0.186860 -0.177876
v -0.227742 -0.207422 -0.120184
v -0.240412 -0.219514 -0.057881
v -0.244352 -0.222672 0.006641
v -0.239409 -0.216774 0.070900
v -0.225774 -0.202048 0.132428
v -0.203971 -0.179059 0.188861
v -0.174837 -0.148691 0.238029
v -0.139493 -0.112110 0.278043
v -0.099296 -0.070722 0.307365
v -0.055792 -0.026119 0.324869
v 0.015795 -0.005945 0.330227
v 0.060836 0.039891 0.322556
v 0.104048 0.083695 0.302496
v 0.143770 0.123785 0.270818
v 0.178474 0.158620 0.228739
v 0.206828 0.186860 0.177876
v 0.227742 0.207422 0.120185
v 0.240413 0.219514 0.057881
v 0.244352 0.222672 -0.006640
v 0.239409 0.216774 -0.070899
v 0.225774 0.202048 -0.132428
v 0.203971 0.179059 -0.188860
v 0.174838 0.148691 -0.238028
v 0.139493 0.112110 -0.278042
v 0.099297 0.070723 -0.307365
v 0.055792 0.026119 -0.324868
v 0.010652 -0.019986 -0.329881
v -0.034390 -0.065822 -0.322210
v -0.077602 -0.109626 -0.302150
v -0.117323 -0.149716 -0.270472
v -0.152028 -0.184550 -0.228393
v -0.180382 -0.212791 -0.177530
v -0.201296 -0.233352 -0.119839
v -0.213966 -0.245444 -0.057535
v -0.217905 -0.248602 0.006986
v -0.212963 -0.242705 0.071246
v -0.199328 -0.227979 0.132774
v -0.177524 -0.204989 0.189206
v -0.148391 -0.174621 0.238374
v -0.113047 -0.138040 0.278388
v -0.072850 -0.096653 0.307711
v -0.029345 -0.052050 0.325215
v -0.010496 0.020411 0.349876
v 0.037274 0.069023 0.341741
v 0.083104 0.115482 0.320465
v 0.125231 0.158000 0.286868
v 0.162038 0.194945 0.242240
v 0.192110 0.224896 0.188296
v 0.214291 0.246703 0.127110
v 0.227729 0.259528 0.061031
v 0.231907 0.262877 -0.007398
v 0.226665 0.256623 -0.075550
v 0.212204 0.241004 -0.140806
v 0.189080 0.216622 -0.200657
v 0.158182 0.184414 -0.252804
v 0.120696 0.145618 -0.295242
v 0.078065 0.101723 -0.326340
v 0.031924 0.054418 -0.344905
v -0.015950 0.005519 -0.350221
v -0.063720 -0.043093 -0.342086
v -0.109550 -0.089551 -0.320810
v -0.151678 -0.132069 -0.287213
v -0.188485 -0.169014 -0.242585
v -0.218557 -0.198965 -0.188641
v -0.240738 -0.220772 -0.127454
v -0.254176 -0.233597 -0.061376
v -0.258354 -0.236947 0.007053
v -0.253111 -0.230692 0.075205
v -0.238650 -0.215073 0.140461
v -0.215526 -0.190692 0.200312
v -0.184628 -0.158483 0.252459
v -0.147142 -0.119687 0.294897
v -0.104511 -0.075792 0.325995
v -0.058371 -0.028487 0.344560
v 0.015950 -0.005519 0.350222
v 0.063720 0.043093 0.342086
v 0.109550 0.089551 0.320811
v 0.151678 0.132069 0.287213
v 0.188485 0.169014 0.242585
v 0.218557 0.198965 0.188642
v 0.240738 0.220772 0.127455
v 0.254176 0.233597 0.061377
v 0.258354 0.236947 -0.007053
v 0.253112 0.230692 -0.075205
v 0.238650 0.215074 -0.140460
v 0.215526 0.190692 -0.200312
v 0.184628 0.158484 -0.252458
v 0.147143 0.119687 -0.294896
v 0.104511 0.075793 -0.325995
v 0.058371 0.028487 -0.344559
v 0.010496 -0.020411 -0.349876
v -0.037274 -0.069023 -0.341740
v -0.083104 -0.115481 -0.320464
v -0.125231 -0.158000 -0.286867
v -0.162038 -0.194945 -0.242239
v -0.192110 -0.224896 -0.188296
v -0.214291 -0.246703 -0.127109
v -0.227729 -0.259528 -0.061031
v -0.231907 -0.262877 0.007399
v -0.226665 -0.256622 0.075551
v -0.212204 -0.241004 0.140807
v -0.189080 -0.216622 0.200658
v -0.158181 -0.184414 0.252804
v -0.120696 -0.145617 0.295242
v -0.078064 -0.101723 0.326341
v -0.031924 -0.054417 0.344905
v -0.012163 -0.014207 0.330129
v -0.055292 0.033688 0.324257
v -0.096825 0.079812 0.305925
v -0.135165 0.122393 0.275835
v -0.168841 0.159794 0.235146
v -0.196556 0.190578 0.185420
v -0.217247 0.213562 0.128568
v -0.230119 0.227862 0.066776
v -0.234675 0.232930 0.002417
v -0.230742 0.228570 -0.062035
v -0.218471 0.214950 -0.124102
v -0.198333 0.192593 -0.181401
v -0.171102 0.162359 -0.231729
v -0.137825 0.125409 -0.273151
v -0.099779 0.083164 -0.304076
v -0.058429 0.037246 -0.323316
v -0.015361 -0.010579 -0.330131
v 0.027767 -0.058474 -0.324260
v 0.069300 -0.104598 -0.305927
v 0.107641 -0.147179 -0.275838
v 0.141316 -0.184580 -0.235148
v 0.169032 -0.215364 -0.185422
v 0.189723 -0.238347 -0.128570
v 0.202594 -0.252648 -0.066778
v 0.207151 -0.257716 -0.002419
v 0.203218 -0.253356 0.062033
v 0.190947 -0.239736 0.124100
v 0.170808 -0.217379 0.181399
v 0.143577 -0.187145 0.231726
v 0.110300 -0.150195 0.273149
v 0.072255 -0.107949 0.304074
v 0.030904 -0.062032 0.323314
v 0.015361 0.010579 0.330132
v -0.027767 0.058474 0.324260
v -0.069300 0.104598 0.305927
v -0.107641 0.147179 0.275838
v -0.141316 0.184580 0.235149
v -0.169032 0.215363 0.185423
v -0.189723 0.238347 0.128571
v -0.202594 0.252648 0.066778
v -0.207151 0.257716 0.002420
v -0.203218 0.253356 -0.062032
v -0.190947 0.239736 -0.124100
v -0.170809 0.217379 -0.181398
v -0.143578 0.187145 -0.231726
v -0.110300 0.150195 -0.273148
v -0.072255 0.107950 -0.304073
v -0.030904 0.062032 -0.323313
v 0.012163 0.014207 -0.330128
v 0.055292 -0.033688 -0.324257
v 0.096825 -0.079812 -0.305924
v 0.135165 -0.122393 -0.275835
v 0.168841 -0.159794 -0.235145
v 0.196556 -0.190578 -0.185419
v 0.217247 -0.213562 -0.128567
v 0.230118 -0.227862 -0.066775
v 0.234675 -0.232930 -0.002416
v 0.230742 -0.228570 0.062036
v 0.218471 -0.214950 0.124103
v 0.198333 -0.192593 0.181402
v 0.171102 -0.162359 0.231729
v 0.137824 -0.125409 0.273152
v 0.099779 -0.083164 0.304077
v 0.058428 -0.037246 0.323317
v -0.012115 -0.014262 0.340129
v -0.056550 0.035084 0.334079
v -0.099341 0.082605 0.315191
v -0.138843 0.126476 0.284190
v -0.173538 0.165009 0.242268
v -0.202093 0.196726 0.191036
v -0.223411 0.220406 0.132462
v -0.236672 0.235140 0.068798
v -0.241367 0.240361 0.002490
v -0.237315 0.235869 -0.063914
v -0.224672 0.221836 -0.127861
v -0.203924 0.198802 -0.186896
v -0.175868 0.167652 -0.238747
v -0.141582 0.129583 -0.281424
v -0.102385 0.086058 -0.313287
v -0.059781 0.038750 -0.333109
v 0.029025 -0.059870 -0.334081
v 0.071816 -0.107391 -0.315193
v 0.111318 -0.151261 -0.284193
v 0.146013 -0.189795 -0.242271
v 0.174569 -0.221511 -0.191038
v 0.195886 -0.245191 -0.132465
v 0.209147 -0.259925 -0.068800
v 0.213842 -0.265146 -0.002492
v 0.209790 -0.260654 0.063912
v 0.197147 -0.246622 0.127859
v 0.176399 -0.223588 0.186893
v 0.148343 -0.192438 0.238745
v 0.114058 -0.154369 0.281422
v 0.074860 -0.110844 0.313284
v 0.032257 -0.063535 0.333107
v 0.015410 0.010524 0.340131
v -0.029025 0.059870 0.334082
v -0.071816 0.107391 0.315194
v -0.111318 0.151261 0.284193
v -0.146013 0.189795 0.242271
v -0.174569 0.221511 0.191039
v -0.195886 0.245191 0.132465
v -0.209147 0.259925 0.068801
v -0.213842 0.265146 0.002493
v -0.209790 0.260654 -0.063911
v -0.197147 0.246622 -0.127859
v -0.176399 0.223588 -0.186893
v -0.148343 0.192438 -0.238745
v -0.114058 0.154369 -0.281422
v -0.074860 0.110844 -0.313284
v -0.032257 0.063536 -0.333106
v 0.056550 -0.035084 -0.334079
v 0.099341 -0.082605 -0.315190
v 0.138843 -0.126476 -0.284190
v 0.173538 -0.165009 -0.242268
v 0.202093 -0.196726 -0.191035
v 0.223411 -0.220406 -0.132462
v 0.236672 -0.235139 -0.068797
v 0.241367 -0.240361 -0.002489
v 0.237315 -0.235869 0.063914
v 0.224672 -0.221836 0.127862
v 0.203923 -0.198802 0.186896
v 0.175867 -0.167652 0.238748
v 0.141582 -0.129583 0.281425
v 0.102384 -0.086058 0.313287
v 0.059781 -0.038749 0.333110
v -0.023270 -0.001795 -0.338887
v 0.002710 0.024705 -0.338640
v 0.002647 0.024774 -0.328622
v -0.001722 0.020318 -0.328664
v -0.023333 -0.001727 -0.328943
vt 0.708974 0.575575
vt 0.765974 0.575575
vt 0.765974 0.503540
vt 0.708974 0.503540
vt 0.665191 0.575575
vt 0.665191 0.503540
vt 0.739820 0.503540
vt 0.739820 0.575575
vt 0.805233 0.575575
vt 0.805233 0.503540
vt 0.739820 0.503540
vt 0.739820 0.575575
vt 0.584213 0.575575
vt 0.584213 0.503540
vt 0.260180 0.575575
vt 0.260180 0.503540
vt 0.194767 0.503540
vt 0.194767 0.575575
vt 0.500000 0.575575
vt 0.500000 0.503540
vt 0.334809 0.575575
vt 0.334809 0.503540
vt 0.415787 0.575575
vt 0.415787 0.503540
vt 0.415787 0.575575
vt 0.415787 0.503540
vt 0.334809 0.575575
vt 0.334809 0.503540
vt 0.500000 0.575575
vt 0.500000 0.503540
vt 0.260180 0.575575
vt 0.260180 0.503540
vt 0.584213 0.575575
vt 0.584213 0.503540
vt 0.194767 0.575575
vt 0.194767 0.503540
vt 0.665191 0.575575
vt 0.665191 0.503540
vt 0.260180 0.575575
vt 0.260180 0.503540
vt 0.739820 0.575575
vt 0.739820 0.503540
vt 0.334809 0.575575
vt 0.334809 0.503540
vt 0.415787 0.575575
vt 0.415787 0.503540
vt 0.500000 0.503540
vt 0.500000 0.575575
vt 0.805233 0.575575
vt 0.805233 0.503540
vt 0.415787 0.575575
vt 0.415787 0.503540
vt 0.334809 0.575575
vt 0.334809 0.503540
vt 0.739820 0.575575
vt 0.739820 0.503540
vt 0.500000 0.575575
vt 0.500000 0.503540
vt 0.260180 0.575575
vt 0.260180 0.503540
vt 0.665190 0.575575
vt 0.665190 0.503540
vt 0.584213 0.575575
vt 0.584213 0.503540
vt 0.194768 0.575575
vt 0.194768 0.503540
vt 0.584212 0.575575
vt 0.584212 0.503540
vt 0.665191 0.575575
vt 0.665191 0.503540
vt 0.805232 0.503540
vt 0.805232 0.575575
vt 0.500000 0.876144
vt 0.426618 0.868917
vt 0.415787 0.923371
vt 0.500000 0.931666
vt 0.356056 0.847512
vt 0.334809 0.898806
vt 0.291026 0.812752
vt 0.260180 0.858916
vt 0.234026 0.765974
vt 0.194768 0.805233
vt 0.187248 0.708974
vt 0.141084 0.739820
vt 0.152488 0.643944
vt 0.101194 0.665191
vt 0.131083 0.573382
vt 0.076629 0.584213
vt 0.123856 0.500000
vt 0.068334 0.500000
vt 0.131083 0.426618
vt 0.076629 0.415787
vt 0.152488 0.356056
vt 0.101194 0.334809
vt 0.187248 0.291025
vt 0.141084 0.260180
vt 0.234026 0.234026
vt 0.194768 0.194767
vt 0.291026 0.187247
vt 0.260180 0.141084
vt 0.356056 0.152488
vt 0.334809 0.101194
vt 0.426618 0.131083
vt 0.415787 0.076629
vt 0.500000 0.123856
vt 0.500000 0.068336
vt 0.573382 0.131083
vt 0.584213 0.076629
vt 0.643944 0.152488
vt 0.665191 0.101194
vt 0.708975 0.187248
vt 0.739820 0.141084
vt 0.765974 0.234026
vt 0.805233 0.194768
vt 0.812753 0.291026
vt 0.858916 0.260180
vt 0.847512 0.356056
vt 0.898806 0.334810
vt 0.868917 0.426618
vt 0.923371 0.415787
vt 0.876144 0.500000
vt 0.931666 0.500000
vt 0.868917 0.573382
vt 0.923371 0.584213
vt 0.847512 0.643945
vt 0.898806 0.665191
vt 0.812752 0.708975
vt 0.858916 0.739820
vt 0.765974 0.765975
vt 0.805232 0.805233
vt 0.708974 0.812753
vt 0.739820 0.858916
vt 0.643944 0.847512
vt 0.665190 0.898806
vt 0.573382 0.868917
vt 0.584212 0.923371
vt 0.426618 0.868917
vt 0.500000 0.876144
vt 0.500000 0.931666
vt 0.415787 0.923371
vt 0.356056 0.847512
vt 0.334809 0.898806
vt 0.291026 0.812752
vt 0.260180 0.858916
vt 0.234026 0.765974
vt 0.194768 0.805233
vt 0.187248 0.708974
vt 0.141084 0.739820
vt 0.131083 0.573382
vt 0.152488 0.643944
vt 0.101194 0.665191
vt 0.076629 0.584213
vt 0.123856 0.500000
vt 0.068334 0.500000
vt 0.131083 0.426618
vt 0.076629 0.415787
vt 0.152488 0.356056
vt 0.101194 0.334809
vt 0.234026 0.234026
vt 0.187248 0.291025
vt 0.141084 0.260180
vt 0.194768 0.194767
vt 0.291026 0.187247
vt 0.260180 0.141084
vt 0.356056 0.152488
vt 0.334809 0.101194
vt 0.426618 0.131083
vt 0.415787 0.076629
vt 0.500000 0.123856
vt 0.500000 0.068336
vt 0.573382 0.131083
vt 0.584213 0.076629
vt 0.643944 0.152488
vt 0.665191 0.101194
vt 0.708975 0.187248
vt 0.739820 0.141084
vt 0.765974 0.234026
vt 0.805233 0.194768
vt 0.812753 0.291026
vt 0.858916 0.260180
vt 0.868917 0.426618
vt 0.847512 0.356056
vt 0.898806 0.334810
vt 0.923371 0.415787
vt 0.876144 0.500000
vt 0.931666 0.500000
vt 0.868917 0.573382
vt 0.923371 0.584213
vt 0.847512 0.643945
vt 0.898806 0.665191
vt 0.765974 0.765975
vt 0.812752 0.708975
vt 0.858916 0.739820
vt 0.805232 0.805233
vt 0.708974 0.812753
vt 0.739820 0.858916
vt 0.643944 0.847512
vt 0.665190 0.898806
vt 0.573382 0.868917
vt 0.584212 0.923371
vt 0.926035 0.627582
vt 0.893852 0.630339
vt 0.894026 0.578467
vt 0.922967 0.575988
vt 0.438346 0.355695
vt 0.410006 0.364110
vt 0.403735 0.313455
vt 0.434948 0.304165
vt 0.103843 0.618889
vt 0.072497 0.627582
vt 0.069430 0.575988
vt 0.097852 0.568121
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.746656 0.562530
vt 0.758131 0.515591
vt 0.783200 0.536323
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.307238 0.438743
vt 0.295030 0.392744
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.331362 0.415507
vt 0.323841 0.422751
vt 0.319887 0.368568
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.356431 0.394775
vt 0.335557 0.412037
vt 0.346128 0.346637
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.926035 0.627582
vt 0.922967 0.575988
vt 0.894026 0.578467
vt 0.893852 0.630339
vt 0.438346 0.355695
vt 0.434948 0.304165
vt 0.403735 0.313455
vt 0.410006 0.364110
vt 0.103843 0.618889
vt 0.097852 0.568121
vt 0.069430 0.575988
vt 0.072497 0.627582
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.783200 0.536323
vt 0.758131 0.515591
vt 0.746656 0.562530
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.307238 0.438743
vt 0.295030 0.392744
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.331362 0.415507
vt 0.319887 0.368568
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.356431 0.394775
vt 0.346128 0.346637
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.314619 0.373692
vt 0.295030 0.392744
vt 0.307238 0.438743
vt 0.335355 0.412205
vt 0.926035 0.627582
vt 0.893852 0.630339
vt 0.894026 0.578467
vt 0.922967 0.575988
vt 0.438346 0.355695
vt 0.410006 0.364110
vt 0.403735 0.313455
vt 0.434948 0.304165
vt 0.103843 0.618889
vt 0.072497 0.627582
vt 0.069430 0.575988
vt 0.097852 0.568121
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.746656 0.562530
vt 0.758131 0.515591
vt 0.783200 0.536323
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.307238 0.438743
vt 0.295030 0.392744
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.331362 0.415507
vt 0.314395 0.373910
vt 0.319887 0.368568
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.356431 0.394775
vt 0.346128 0.346637
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.926035 0.627582
vt 0.922967 0.575988
vt 0.894026 0.578467
vt 0.893852 0.630339
vt 0.438346 0.355695
vt 0.434948 0.304165
vt 0.403735 0.313455
vt 0.410006 0.364110
vt 0.103843 0.618889
vt 0.097852 0.568121
vt 0.069430 0.575988
vt 0.072497 0.627582
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.783200 0.536323
vt 0.758131 0.515591
vt 0.746656 0.562530
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.346128 0.346637
vt 0.356431 0.394775
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.321518 0.424988
vt 0.321736 0.424778
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vn -0.8200 -0.0000 -0.5724
vn 0.9159 0.0000 0.4014
vn -0.6926 0.0000 -0.7214
vn 0.9766 -0.0000 0.2150
vn 0.9998 -0.0000 0.0204
vn -0.9159 0.0000 -0.4014
vn 0.9846 0.0000 -0.1751
vn -0.9766 0.0000 -0.2150
vn 0.9315 -0.0000 -0.3638
vn -0.9998 0.0000 -0.0204
vn 0.8426 0.0000 -0.5385
vn -0.9846 0.0000 0.1751
vn 0.7214 0.0000 -0.6926
vn -0.9315 -0.0000 0.3638
vn 0.5724 0.0000 -0.8200
vn -0.8426 -0.0000 0.5385
vn 0.4014 0.0000 -0.9159
vn 0.1751 -0.0000 0.9846
vn -0.7214 0.0000 0.6926
vn 0.2150 -0.0000 -0.9766
vn 0.3638 -0.0000 0.9315
vn -0.5724 0.0000 0.8200
vn 0.0203 -0.0000 -0.9998
vn 0.5385 -0.0000 0.8426
vn -0.4014 0.0000 0.9159
vn -0.1751 0.0000 -0.9846
vn 0.6926 0.0000 0.7214
vn -0.2150 0.0000 0.9766
vn -0.3638 0.0000 -0.9315
vn 0.8200 -0.0000 0.5724
vn -0.0204 -0.0000 0.9998
vn -0.5385 0.0000 -0.8426
vn -0.0000 -1.0000 -0.0000
vn 0.0000 1.0000 0.0000
vn 0.6211 0.6395 0.4531
vn -0.4502 -0.4692 -0.7597
vn 0.6722 0.6892 0.2705
vn -0.5461 -0.5652 -0.6183
vn 0.6975 0.7124 0.0775
vn -0.6211 -0.6395 -0.4531
vn 0.6960 0.7082 -0.1185
vn -0.6722 -0.6892 -0.2705
vn 0.6677 0.6768 -0.3100
vn -0.6975 -0.7124 -0.0775
vn 0.6138 0.6194 -0.4895
vn -0.6960 -0.7082 0.1185
vn 0.5362 0.5382 -0.6502
vn -0.6677 -0.6768 0.3100
vn 0.4381 0.4364 -0.7859
vn -0.6138 -0.6194 0.4895
vn 0.3232 0.3177 -0.8914
vn 0.0764 0.0911 0.9929
vn -0.5362 -0.5382 0.6502
vn 0.1958 0.1868 -0.9627
vn 0.2107 0.2275 0.9507
vn -0.4381 -0.4364 0.7859
vn 0.0609 0.0488 -0.9970
vn 0.3369 0.3552 0.8720
vn -0.3232 -0.3177 0.8914
vn -0.0764 -0.0911 -0.9929
vn 0.4502 0.4692 0.7597
vn -0.1958 -0.1868 0.9627
vn -0.2107 -0.2275 -0.9507
vn 0.5461 0.5652 0.6183
vn -0.0609 -0.0488 0.9970
vn -0.3369 -0.3552 -0.8720
vn 0.7140 -0.7001 0.0093
vn 0.0704 -0.0783 0.9944
vn -0.7140 0.7001 -0.0093
vn -0.5879 0.6528 0.4778
vn 0.4208 -0.4672 -0.7776
vn -0.6389 0.7095 0.2973
vn 0.5142 -0.5709 -0.6400
vn -0.6655 0.7390 0.1053
vn 0.5879 -0.6528 -0.4778
vn -0.6664 0.7400 -0.0907
vn 0.6389 -0.7095 -0.2973
vn -0.6417 0.7127 -0.2833
vn 0.6655 -0.7390 -0.1053
vn -0.5924 0.6579 -0.4649
vn 0.6664 -0.7401 0.0907
vn -0.5203 0.5779 -0.6287
vn 0.6417 -0.7127 0.2833
vn -0.4282 0.4757 -0.7683
vn 0.5924 -0.6579 0.4649
vn -0.3197 0.3551 -0.8784
vn -0.0608 0.0674 0.9959
vn 0.5203 -0.5779 0.6287
vn -0.1989 0.2210 -0.9548
vn -0.1896 0.2104 0.9590
vn 0.4282 -0.4757 0.7683
vn -0.0704 0.0783 -0.9944
vn -0.3112 0.3454 0.8854
vn 0.3197 -0.3551 0.8784
vn 0.0608 -0.0674 -0.9959
vn -0.4208 0.4672 0.7776
vn 0.1989 -0.2210 0.9548
vn 0.1896 -0.2105 -0.9590
vn -0.5142 0.5709 0.6400
vn 0.3112 -0.3454 -0.8854
vn 0.4283 -0.4757 0.7683
vn -0.1896 0.2105 0.9590
vn 0.7431 0.6692 0.0001
vn -0.7431 -0.6692 -0.0001
vn -0.0433 0.0403 0.9982
g steel_steel_steel
usemtl steel
s off
f 6/1/1 5/2/1 37/3/1 38/4/1
f 71/5/2 103/6/2 102/7/2 70/8/2
f 85/9/3 117/10/3 116/11/3 84/12/3
f 72/13/4 104/14/4 103/6/4 71/5/4
f 86/15/1 118/16/1 117/17/1 85/18/1
f 73/19/5 105/20/5 104/14/5 72/13/5
f 87/21/6 119/22/6 118/16/6 86/15/6
f 74/23/7 106/24/7 105/20/7 73/19/7
f 88/25/8 120/26/8 119/22/8 87/21/8
f 75/27/9 107/28/9 106/24/9 74/23/9
f 89/29/10 121/30/10 120/26/10 88/25/10
f 76/31/11 108/32/11 107/28/11 75/27/11
f 90/33/12 122/34/12 121/30/12 89/29/12
f 77/35/13 109/36/13 108/32/13 76/31/13
f 91/37/14 123/38/14 122/34/14 90/33/14
f 78/39/15 110/40/15 109/36/15 77/35/15
f 92/41/16 124/42/16 123/38/16 91/37/16
f 79/43/17 111/44/17 110/40/17 78/39/17
f 66/45/18 98/46/18 97/47/18 65/48/18
f 93/49/19 125/50/19 124/42/19 92/41/19
f 80/51/20 112/52/20 111/44/20 79/43/20
f 67/53/21 99/54/21 98/46/21 66/45/21
f 94/55/22 126/56/22 125/50/22 93/49/22
f 81/57/23 113/58/23 112/52/23 80/51/23
f 68/59/24 100/60/24 99/54/24 67/53/24
f 95/61/25 127/62/25 126/56/25 94/55/25
f 82/63/26 114/64/26 113/58/26 81/57/26
f 69/65/27 101/66/27 100/60/27 68/59/27
f 96/67/28 128/68/28 127/62/28 95/61/28
f 83/69/29 115/70/29 114/64/29 82/63/29
f 70/8/30 102/7/30 101/71/30 69/72/30
f 65/48/31 97/47/31 128/68/31 96/67/31
f 84/12/32 116/11/32 115/70/32 83/69/32
f 1/73/33 2/74/33 66/75/33 65/76/33
f 2/74/33 3/77/33 67/78/33 66/75/33
f 3/77/33 4/79/33 68/80/33 67/78/33
f 4/79/33 5/81/33 69/82/33 68/80/33
f 5/81/33 6/83/33 70/84/33 69/82/33
f 6/83/33 7/85/33 71/86/33 70/84/33
f 7/85/33 8/87/33 72/88/33 71/86/33
f 8/87/33 9/89/33 73/90/33 72/88/33
f 9/89/33 10/91/33 74/92/33 73/90/33
f 10/91/33 11/93/33 75/94/33 74/92/33
f 11/93/33 12/95/33 76/96/33 75/94/33
f 12/95/33 13/97/33 77/98/33 76/96/33
f 13/97/33 14/99/33 78/100/33 77/98/33
f 14/99/33 15/101/33 79/102/33 78/100/33
f 15/101/33 16/103/33 80/104/33 79/102/33
f 16/103/33 17/105/33 81/106/33 80/104/33
f 17/105/33 18/107/33 82/108/33 81/106/33
f 18/107/33 19/109/33 83/110/33 82/108/33
f 19/109/33 20/111/33 84/112/33 83/110/33
f 20/111/33 21/113/33 85/114/33 84/112/33
f 21/113/33 22/115/33 86/116/33 85/114/33
f 22/115/33 23/117/33 87/118/33 86/116/33
f 23/117/33 24/119/33 88/120/33 87/118/33
f 24/119/33 25/121/33 89/122/33 88/120/33
f 25/121/33 26/123/33 90/124/33 89/122/33
f 26/123/33 27/125/33 91/126/33 90/124/33
f 27/125/33 28/127/33 92/128/33 91/126/33
f 28/127/33 29/129/33 93/130/33 92/128/33
f 29/129/33 30/131/33 94/132/33 93/130/33
f 30/131/33 31/133/33 95/134/33 94/132/33
f 31/133/33 32/135/33 96/136/33 95/134/33
f 32/135/33 1/73/33 65/76/33 96/136/33
f 34/137/34 33/138/34 97/139/34 98/140/34
f 35/141/34 34/137/34 98/140/34 99/142/34
f 36/143/34 35/141/34 99/142/34 100/144/34
f 37/145/34 36/143/34 100/144/34 101/146/34
f 38/147/34 37/145/34 101/146/34 102/148/34
f 40/149/34 39/150/34 103/151/34 104/152/34
f 41/153/34 40/149/34 104/152/34 105/154/34
f 42/155/34 41/153/34 105/154/34 106/156/34
f 43/157/34 42/155/34 106/156/34 107/158/34
f 45/159/34 44/160/34 108/161/34 109/162/34
f 46/163/34 45/159/34 109/162/34 110/164/34
f 47/165/34 46/163/34 110/164/34 111/166/34
f 48/167/34 47/165/34 111/166/34 112/168/34
f 49/169/34 48/167/34 112/168/34 113/170/34
f 50/171/34 49/169/34 113/170/34 114/172/34
f 51/173/34 50/171/34 114/172/34 115/174/34
f 52/175/34 51/173/34 115/174/34 116/176/34
f 53/177/34 52/175/34 116/176/34 117/178/34
f 54/179/34 53/177/34 117/178/34 118/180/34
f 56/181/34 55/182/34 119/183/34 120/184/34
f 57/185/34 56/181/34 120/184/34 121/186/34
f 58/187/34 57/185/34 121/186/34 122/188/34
f 59/189/34 58/187/34 122/188/34 123/190/34
f 61/191/34 60/192/34 124/193/34 125/194/34
f 62/195/34 61/191/34 125/194/34 126/196/34
f 63/197/34 62/195/34 126/196/34 127/198/34
f 64/199/34 63/197/34 127/198/34 128/200/34
f 33/138/34 64/199/34 128/200/34 97/139/34
f 135/201/35 134/202/35 166/203/35 167/204/35
f 149/205/36 148/206/36 180/207/36 181/208/36
f 136/209/37 135/210/37 167/211/37 168/212/37
f 150/213/38 149/205/38 181/208/38 182/214/38
f 137/215/39 136/209/39 168/212/39 169/216/39
f 151/217/40 150/213/40 182/214/40 183/218/40
f 138/219/41 137/215/41 169/216/41 170/220/41
f 152/221/42 151/217/42 183/218/42 184/222/42
f 139/223/43 138/219/43 170/220/43 171/224/43
f 153/225/44 152/221/44 184/222/44 185/226/44
f 140/227/45 139/223/45 171/224/45 172/228/45
f 154/229/46 153/225/46 185/226/46 186/230/46
f 141/231/47 140/227/47 172/228/47 173/232/47
f 155/233/48 154/229/48 186/230/48 187/234/48
f 142/235/49 141/231/49 173/232/49 174/236/49
f 156/237/50 155/233/50 187/234/50 188/238/50
f 143/239/51 142/235/51 174/236/51 175/240/51
f 130/241/52 129/242/52 161/243/52 162/244/52
f 157/245/53 156/237/53 188/238/53 189/246/53
f 144/247/54 143/239/54 175/240/54 176/248/54
f 131/249/55 130/241/55 162/244/55 163/250/55
f 158/251/56 157/245/56 189/246/56 190/252/56
f 145/253/57 386/254/57 144/247/57 176/248/57 177/255/57
f 132/256/58 131/249/58 163/250/58 164/257/58
f 159/258/59 158/251/59 190/252/59 191/259/59
f 146/260/60 387/261/60 145/253/60 177/255/60 178/262/60
f 133/263/61 132/256/61 164/257/61 165/264/61
f 160/265/62 159/258/62 191/259/62 192/266/62
f 147/267/63 146/260/63 178/262/63 179/268/63
f 134/202/64 133/263/64 165/264/64 166/203/64
f 129/242/65 160/265/65 192/266/65 161/243/65
f 148/206/66 147/267/66 179/268/66 180/207/66
f 199/269/40 231/270/40 230/271/40 198/272/40
f 213/273/61 245/274/61 244/275/61 212/276/61
f 200/277/42 232/278/42 231/279/42 199/280/42
f 214/281/64 246/282/64 245/274/64 213/273/64
f 201/283/44 233/284/44 232/278/44 200/277/44
f 215/285/35 247/286/35 246/282/35 214/281/35
f 202/287/46 234/288/46 233/284/46 201/283/46
f 216/289/37 248/290/37 247/286/37 215/285/37
f 203/291/48 235/292/48 234/288/48 202/287/48
f 217/293/39 249/294/39 248/290/39 216/289/39
f 204/295/50 236/296/50 235/292/50 203/291/50
f 218/297/41 250/298/41 249/294/41 217/293/41
f 205/299/53 237/300/53 236/296/53 204/295/53
f 219/301/43 251/302/43 250/298/43 218/297/43
f 206/303/56 238/304/56 237/300/56 205/299/56
f 220/305/45 252/306/45 251/302/45 219/301/45
f 207/307/59 239/308/59 238/304/59 206/303/59
f 194/309/60 226/310/60 225/311/60 193/312/60
f 221/313/47 253/314/47 252/306/47 220/305/47
f 208/315/62 240/316/62 239/308/62 207/307/62
f 195/317/63 227/318/63 226/310/63 194/309/63
f 222/319/49 254/320/49 253/314/49 221/313/49
f 209/321/65 241/322/65 240/316/65 208/315/65
f 196/323/66 228/324/66 227/318/66 195/317/66
f 223/325/51 255/326/51 254/320/51 222/319/51
f 210/327/52 242/328/52 241/322/52 209/321/52
f 197/329/36 229/330/36 228/324/36 196/323/36
f 224/331/54 256/332/54 255/326/54 223/325/54
f 211/333/55 243/334/55 242/328/55 210/327/55
f 198/272/38 230/271/38 229/330/38 197/329/38
f 193/312/57 225/311/57 256/332/57 224/331/57
f 212/276/58 244/275/58 243/334/58 211/333/58
f 129/242/67 130/241/67 194/309/67 193/312/67
f 130/241/67 131/249/67 195/317/67 194/309/67
f 131/249/67 132/256/67 196/323/67 195/317/67
f 132/256/67 133/263/67 197/329/67 196/323/67
f 133/263/67 134/202/67 198/272/67 197/329/67
f 134/202/67 135/201/67 199/269/67 198/272/67
f 135/210/67 136/209/67 200/277/67 199/280/67
f 136/209/67 137/215/67 201/283/67 200/277/67
f 137/215/67 138/219/67 202/287/67 201/283/67
f 138/219/67 139/223/67 203/291/67 202/287/67
f 139/223/67 140/227/67 204/295/67 203/291/67
f 140/227/67 141/231/67 205/299/67 204/295/67
f 141/231/67 142/235/67 206/303/67 205/299/67
f 142/235/67 143/239/67 207/307/67 206/303/67
f 143/239/67 144/247/67 208/315/67 207/307/67
f 384/335/68 367/336/68 336/337/68 383/338/68
f 146/260/67 147/267/67 211/333/67 210/327/67
f 147/267/67 148/206/67 212/276/67 211/333/67
f 148/206/67 149/205/67 213/273/67 212/276/67
f 149/205/67 150/213/67 214/281/67 213/273/67
f 150/213/67 151/217/67 215/285/67 214/281/67
f 151/217/67 152/221/67 216/289/67 215/285/67
f 152/221/67 153/225/67 217/293/67 216/289/67
f 153/225/67 154/229/67 218/297/67 217/293/67
f 154/229/67 155/233/67 219/301/67 218/297/67
f 155/233/67 156/237/67 220/305/67 219/301/67
f 156/237/67 157/245/67 221/313/67 220/305/67
f 157/245/67 158/251/67 222/319/67 221/313/67
f 158/251/67 159/258/67 223/325/67 222/319/67
f 159/258/67 160/265/67 224/331/67 223/325/67
f 160/265/67 129/242/67 193/312/67 224/331/67
f 162/244/69 161/243/69 225/311/69 226/310/69
f 163/250/69 162/244/69 226/310/69 227/318/69
f 164/257/69 163/250/69 227/318/69 228/324/69
f 165/264/69 164/257/69 228/324/69 229/330/69
f 166/203/69 165/264/69 229/330/69 230/271/69
f 167/204/69 166/203/69 230/271/69 231/270/69
f 168/212/69 167/211/69 231/279/69 232/278/69
f 169/216/69 168/212/69 232/278/69 233/284/69
f 170/220/69 169/216/69 233/284/69 234/288/69
f 171/224/69 170/220/69 234/288/69 235/292/69
f 172/228/69 171/224/69 235/292/69 236/296/69
f 173/232/69 172/228/69 236/296/69 237/300/69
f 174/236/69 173/232/69 237/300/69 238/304/69
f 175/240/69 174/236/69 238/304/69 239/308/69
f 176/248/69 175/240/69 239/308/69 240/316/69
f 177/255/69 176/248/69 240/316/69 241/322/69
f 178/262/69 177/255/69 241/322/69 242/328/69
f 179/268/69 178/262/69 242/328/69 243/334/69
f 180/207/69 179/268/69 243/334/69 244/275/69
f 181/208/69 180/207/69 244/275/69 245/274/69
f 182/214/69 181/208/69 245/274/69 246/282/69
f 183/218/69 182/214/69 246/282/69 247/286/69
f 184/222/69 183/218/69 247/286/69 248/290/69
f 185/226/69 184/222/69 248/290/69 249/294/69
f 186/230/69 185/226/69 249/294/69 250/298/69
f 187/234/69 186/230/69 250/298/69 251/302/69
f 188/238/69 187/234/69 251/302/69 252/306/69
f 189/246/69 188/238/69 252/306/69 253/314/69
f 190/252/69 189/246/69 253/314/69 254/320/69
f 191/259/69 190/252/69 254/320/69 255/326/69
f 192/266/69 191/259/69 255/326/69 256/332/69
f 161/243/69 192/266/69 256/332/69 225/311/69
f 263/339/70 262/340/70 294/341/70 295/342/70
f 277/343/71 276/344/71 308/345/71 309/346/71
f 264/347/72 263/348/72 295/349/72 296/350/72
f 278/351/73 277/343/73 309/346/73 310/352/73
f 265/353/74 264/347/74 296/350/74 297/354/74
f 279/355/75 278/351/75 310/352/75 311/356/75
f 266/357/76 265/353/76 297/354/76 298/358/76
f 280/359/77 279/355/77 311/356/77 312/360/77
f 267/361/78 266/357/78 298/358/78 299/362/78
f 281/363/79 280/359/79 312/360/79 313/364/79
f 268/365/80 267/361/80 299/362/80 300/366/80
f 282/367/81 281/363/81 313/364/81 314/368/81
f 269/369/82 268/365/82 300/366/82 301/370/82
f 283/371/83 282/367/83 314/368/83 315/372/83
f 270/373/84 269/369/84 301/370/84 302/374/84
f 284/375/85 283/371/85 315/372/85 316/376/85
f 271/377/86 270/373/86 302/374/86 303/378/86
f 258/379/87 257/380/87 289/381/87 290/382/87
f 285/383/88 284/375/88 316/376/88 317/384/88
f 272/385/89 271/377/89 303/378/89 304/386/89
f 259/387/90 258/379/90 290/382/90 291/388/90
f 286/389/91 285/383/91 317/384/91 318/390/91
f 273/391/92 272/385/92 304/386/92 385/392/92 305/393/92
f 260/394/93 259/387/93 291/388/93 292/395/93
f 287/396/94 286/389/94 318/390/94 319/397/94
f 274/398/95 273/391/95 305/393/95 306/399/95
f 261/400/96 260/394/96 292/395/96 293/401/96
f 288/402/97 287/396/97 319/397/97 320/403/97
f 275/404/98 274/398/98 306/399/98 307/405/98
f 262/340/99 261/400/99 293/401/99 294/341/99
f 257/380/68 288/402/68 320/403/68 289/381/68
f 276/344/100 275/404/100 307/405/100 308/345/100
f 327/406/75 358/407/75 357/408/75 326/409/75
f 340/410/96 371/411/96 370/412/96 339/413/96
f 328/414/77 359/415/77 358/416/77 327/417/77
f 341/418/99 372/419/99 371/411/99 340/410/99
f 329/420/79 360/421/79 359/415/79 328/414/79
f 342/422/70 373/423/70 372/419/70 341/418/70
f 330/424/81 361/425/81 360/421/81 329/420/81
f 343/426/72 374/427/72 373/423/72 342/422/72
f 331/428/83 362/429/83 361/425/83 330/424/83
f 344/430/74 375/431/74 374/427/74 343/426/74
f 332/432/85 363/433/85 362/429/85 331/428/85
f 345/434/76 376/435/76 375/431/76 344/430/76
f 333/436/88 364/437/88 363/433/88 332/432/88
f 346/438/78 377/439/78 376/435/78 345/434/78
f 334/440/101 365/441/101 364/437/101 333/436/101
f 347/442/80 378/443/80 377/439/80 346/438/80
f 335/444/94 366/445/94 365/441/94 334/440/94
f 322/446/95 353/447/95 352/448/95 321/449/95
f 348/450/82 379/451/82 378/443/82 347/442/82
f 336/337/97 367/336/97 366/445/97 335/444/97
f 323/452/98 354/453/98 353/447/98 322/446/98
f 349/454/84 380/455/84 379/451/84 348/450/84
f 324/456/100 355/457/100 354/453/100 323/452/100
f 350/458/86 381/459/86 380/455/86 349/454/86
f 325/460/71 356/461/71 355/457/71 324/456/71
f 351/462/89 382/463/89 381/459/89 350/458/89
f 338/464/102 369/465/102 368/466/102 337/467/102
f 326/409/73 357/408/73 356/461/73 325/460/73
f 321/449/92 352/448/92 382/463/92 351/462/92
f 339/413/93 370/412/93 369/465/93 338/464/93
f 257/380/103 258/379/103 322/446/103 321/449/103
f 258/379/103 259/387/103 323/452/103 322/446/103
f 259/387/103 260/394/103 324/456/103 323/452/103
f 260/394/103 261/400/103 325/460/103 324/456/103
f 261/400/103 262/340/103 326/409/103 325/460/103
f 262/340/103 263/339/103 327/406/103 326/409/103
f 263/348/103 264/347/103 328/414/103 327/417/103
f 264/347/103 265/353/103 329/420/103 328/414/103
f 265/353/103 266/357/103 330/424/103 329/420/103
f 266/357/103 267/361/103 331/428/103 330/424/103
f 267/361/103 268/365/103 332/432/103 331/428/103
f 268/365/103 269/369/103 333/436/103 332/432/103
f 269/369/103 270/373/103 334/440/103 333/436/103
f 270/373/103 271/377/103 335/444/103 334/440/103
f 271/377/103 272/385/103 336/337/103 335/444/103
f 336/337/103 272/385/103 387/261/103 383/338/103
f 274/398/103 275/404/103 338/464/103 337/467/103
f 275/404/103 276/344/103 339/413/103 338/464/103
f 276/344/103 277/343/103 340/410/103 339/413/103
f 277/343/103 278/351/103 341/418/103 340/410/103
f 278/351/103 279/355/103 342/422/103 341/418/103
f 279/355/103 280/359/103 343/426/103 342/422/103
f 280/359/103 281/363/103 344/430/103 343/426/103
f 281/363/103 282/367/103 345/434/103 344/430/103
f 282/367/103 283/371/103 346/438/103 345/434/103
f 283/371/103 284/375/103 347/442/103 346/438/103
f 284/375/103 285/383/103 348/450/103 347/442/103
f 285/383/103 286/389/103 349/454/103 348/450/103
f 286/389/103 287/396/103 350/458/103 349/454/103
f 287/396/103 288/402/103 351/462/103 350/458/103
f 288/402/103 257/380/103 321/449/103 351/462/103
f 290/382/104 289/381/104 352/448/104 353/447/104
f 291/388/104 290/382/104 353/447/104 354/453/104
f 292/395/104 291/388/104 354/453/104 355/457/104
f 293/401/104 292/395/104 355/457/104 356/461/104
f 294/341/104 293/401/104 356/461/104 357/408/104
f 295/342/104 294/341/104 357/408/104 358/407/104
f 296/350/104 295/349/104 358/416/104 359/415/104
f 297/354/104 296/350/104 359/415/104 360/421/104
f 298/358/104 297/354/104 360/421/104 361/425/104
f 299/362/104 298/358/104 361/425/104 362/429/104
f 300/366/104 299/362/104 362/429/104 363/433/104
f 301/370/104 300/366/104 363/433/104 364/437/104
f 302/374/104 301/370/104 364/437/104 365/441/104
f 303/378/104 302/374/104 365/441/104 366/445/104
f 304/386/104 303/378/104 366/445/104 367/336/104
f 307/405/104 306/399/104 368/466/104 369/465/104
f 308/345/104 307/405/104 369/465/104 370/412/104
f 309/346/104 308/345/104 370/412/104 371/411/104
f 310/352/104 309/346/104 371/411/104 372/419/104
f 311/356/104 310/352/104 372/419/104 373/423/104
f 312/360/104 311/356/104 373/423/104 374/427/104
f 313/364/104 312/360/104 374/427/104 375/431/104
f 314/368/104 313/364/104 375/431/104 376/435/104
f 315/372/104 314/368/104 376/435/104 377/439/104
f 316/376/104 315/372/104 377/439/104 378/443/104
f 317/384/104 316/376/104 378/443/104 379/451/104
f 318/390/104 317/384/104 379/451/104 380/455/104
f 319/397/104 318/390/104 380/455/104 381/459/104
f 320/403/104 319/397/104 381/459/104 382/463/104
f 289/381/104 320/403/104 382/463/104 352/448/104
f 103/151/34 39/150/34 38/147/34 102/148/34
f 108/161/34 44/160/34 43/157/34 107/158/34
f 124/193/34 60/192/34 59/189/34 123/190/34
f 119/183/34 55/182/34 54/179/34 118/180/34
f 14/468/22 13/469/22 45/470/22 46/471/22
f 44/472/11 43/473/11 11/474/11 12/475/11
f 9/89/12 41/153/12 42/155/12 10/476/12
f 43/473/9 42/477/9 10/476/9 11/474/9
f 29/478/22 30/479/22 62/480/22 61/481/22
f 62/480/25 30/479/25 31/482/25 63/483/25
f 6/484/2 7/485/2 39/486/2 38/487/2
f 4/488/27 5/489/27 37/490/27 36/491/27
f 15/492/25 14/468/25 46/471/25 47/493/25
f 2/494/21 3/495/21 35/496/21 34/497/21
f 22/498/30 21/499/30 53/500/30 54/501/30
f 17/502/31 16/503/31 48/504/31 49/505/31
f 32/506/31 1/507/31 33/508/31 64/509/31
f 29/478/13 28/510/13 60/511/13 61/481/13
f 12/475/13 13/469/13 45/470/13 44/472/13
f 63/483/28 31/482/28 32/506/28 64/509/28
f 19/512/21 18/513/21 50/514/21 51/515/21
f 20/516/24 19/512/24 51/515/24 52/517/24
f 28/510/11 27/518/11 59/519/11 60/511/11
f 21/499/27 20/516/27 52/517/27 53/500/27
f 24/520/4 23/521/4 55/522/4 56/523/4
f 35/496/24 3/495/24 4/488/24 36/491/24
f 49/505/18 50/514/18 18/513/18 17/502/18
f 8/524/4 40/525/4 39/486/4 7/485/4
f 48/504/28 16/503/28 15/492/28 47/493/28
f 33/508/18 1/507/18 2/494/18 34/497/18
f 23/521/2 22/498/2 54/501/2 55/522/2
f 26/123/9 58/187/9 59/189/9 27/518/9
f 25/121/7 57/185/7 58/187/7 26/123/7
f 24/520/5 56/523/5 57/185/5 25/121/5
f 8/524/10 40/525/10 41/153/10 9/89/10
f 208/315/67 144/247/67 385/526/67 384/527/67
f 384/335/104 385/392/104 304/386/104 367/336/104
f 208/315/67 384/527/67 209/321/67
f 384/527/67 383/338/67 209/321/67
f 209/321/67 383/338/67 210/327/67
f 210/327/67 383/338/67 387/261/67 146/260/67
f 368/466/105 384/335/105 383/338/105 337/467/105
f 306/528/104 385/529/104 384/530/104 368/531/104
f 273/391/103 274/398/103 337/467/103
f 337/467/103 383/338/103 273/391/103
f 387/261/103 273/391/103 383/338/103
o bronze
v 0.173510 -0.188755 -0.202857
v 0.076886 -0.221335 -0.228002
v -0.017971 -0.231176 -0.230477
v -0.111298 -0.221335 -0.213328
v 0.203459 -0.094377 -0.237871
v 0.088018 -0.110667 -0.294772
v -0.023774 -0.115588 -0.304892
v -0.132646 -0.110667 -0.277566
v 0.212506 0.000000 -0.248448
v 0.091465 -0.000000 -0.313878
v -0.025415 -0.000000 -0.325944
v -0.139012 0.000000 -0.295907
v 0.203459 0.094377 -0.237871
v 0.088018 0.110667 -0.294772
v -0.023774 0.115588 -0.304892
v -0.132646 0.110667 -0.277566
v -0.202857 -0.188755 -0.173510
v -0.228002 -0.221335 -0.076886
v -0.230477 -0.231176 0.017971
v -0.213328 -0.221335 0.111298
v -0.237871 -0.094377 -0.203459
v -0.294772 -0.110667 -0.088018
v -0.304892 -0.115588 0.023774
v -0.277566 -0.110667 0.132646
v -0.248448 -0.000000 -0.212506
v -0.313878 0.000000 -0.091465
v -0.325944 0.000000 0.025415
v -0.295907 0.000000 0.139012
v -0.237871 0.094377 -0.203459
v -0.294772 0.110667 -0.088018
v -0.304892 0.115588 0.023774
v -0.277566 0.110667 0.132646
v -0.173510 -0.188755 0.202857
v -0.076886 -0.221335 0.228002
v 0.017971 -0.231176 0.230477
v 0.111298 -0.221335 0.213328
v -0.203459 -0.094377 0.237871
v -0.088018 -0.110667 0.294772
v 0.023774 -0.115588 0.304892
v 0.132646 -0.110667 0.277566
v -0.212506 -0.000000 0.248448
v -0.091465 0.000000 0.313878
v 0.025415 0.000000 0.325944
v 0.139012 -0.000000 0.295907
v -0.203459 0.094377 0.237871
v -0.088018 0.110667 0.294772
v 0.023774 0.115588 0.304892
v 0.132646 0.110667 0.277566
v 0.202857 -0.188755 0.173510
v 0.228002 -0.221335 0.076886
v 0.230477 -0.231176 -0.017971
v 0.213328 -0.221335 -0.111298
v 0.237871 -0.094377 0.203459
v 0.294772 -0.110667 0.088018
v 0.304892 -0.115588 -0.023774
v 0.277566 -0.110667 -0.132646
v 0.248448 0.000000 0.212506
v 0.313878 -0.000000 0.091465
v 0.325944 0.000000 -0.025415
v 0.295907 -0.000000 -0.139012
v 0.237871 0.094377 0.203459
v 0.294772 0.110667 0.088018
v 0.304892 0.115588 -0.023774
v 0.277566 0.110667 -0.132646
v 0.118936 -0.287038 0.101729
v 0.008986 -0.305818 0.115238
v -0.101729 -0.287038 0.118936
v 0.115238 -0.305818 -0.008986
v 0.000000 -0.326933 0.000000
v -0.115238 -0.305818 0.008986
v 0.101729 -0.287038 -0.118936
v -0.008986 -0.305818 -0.115238
v -0.118936 -0.287038 -0.101729
v 0.173510 0.188755 -0.202857
v 0.076886 0.221335 -0.228002
v -0.017971 0.231176 -0.230477
v -0.111298 0.221335 -0.213328
v -0.202857 0.188755 -0.173510
v 0.213328 0.221335 -0.111298
v 0.101729 0.287038 -0.118936
v -0.008986 0.305818 -0.115238
v -0.118936 0.287038 -0.101729
v -0.228002 0.221335 -0.076886
v 0.230477 0.231176 -0.017971
v 0.115238 0.305818 -0.008986
v 0.000000 0.326933 -0.000000
v -0.115238 0.305818 0.008986
v -0.230477 0.231176 0.017971
v 0.228002 0.221335 0.076886
v 0.118936 0.287038 0.101729
v 0.008986 0.305818 0.115238
v -0.101729 0.287038 0.118936
v -0.213328 0.221335 0.111298
v 0.202857 0.188755 0.173510
v 0.111298 0.221335 0.213328
v 0.017971 0.231176 0.230477
v -0.076886 0.221335 0.228002
v -0.173510 0.188755 0.202857
vt 0.507969 0.347291
vt 0.547223 0.341050
vt 0.538517 0.415417
vt 0.498706 0.406436
vt 0.582474 0.349307
vt 0.571984 0.427658
vt 0.614052 0.368999
vt 0.604560 0.442802
vt 0.643757 0.399897
vt 0.641634 0.461050
vt 0.531214 0.479431
vt 0.492041 0.460529
vt 0.564772 0.494797
vt 0.598895 0.507439
vt 0.639793 0.516562
vt 0.522506 0.542810
vt 0.485626 0.514681
vt 0.556919 0.561801
vt 0.593788 0.572359
vt 0.637674 0.572055
vt 0.506645 0.613877
vt 0.477462 0.574086
vt 0.542702 0.639352
vt 0.587098 0.647606
vt 0.634265 0.633125
vt 0.675283 0.376871
vt 0.679469 0.452343
vt 0.078468 0.376871
vt 0.110099 0.364441
vt 0.115497 0.444372
vt 0.082654 0.452343
vt 0.143314 0.362142
vt 0.148595 0.437406
vt 0.179054 0.371777
vt 0.187219 0.431181
vt 0.681202 0.517866
vt 0.119486 0.512562
vt 0.084387 0.517866
vt 0.153988 0.502136
vt 0.193633 0.485333
vt 0.681848 0.583469
vt 0.124162 0.580673
vt 0.085033 0.583469
vt 0.161321 0.566277
vt 0.200298 0.539427
vt 0.680034 0.659313
vt 0.133808 0.660111
vt 0.083219 0.659313
vt 0.176902 0.638347
vt 0.209562 0.598572
vt 0.208238 0.331986
vt 0.224099 0.403052
vt 0.244294 0.306511
vt 0.258511 0.384062
vt 0.288691 0.298257
vt 0.295381 0.373504
vt 0.335857 0.312738
vt 0.339266 0.373808
vt 0.232807 0.466432
vt 0.266365 0.451066
vt 0.300488 0.438423
vt 0.341385 0.429301
vt 0.240110 0.530446
vt 0.273576 0.518205
vt 0.306153 0.503061
vt 0.343226 0.484813
vt 0.248815 0.604813
vt 0.284067 0.596556
vt 0.315645 0.576864
vt 0.345350 0.545966
vt 0.381627 0.286550
vt 0.383441 0.362394
vt 0.432215 0.285752
vt 0.422569 0.365190
vt 0.475310 0.307516
vt 0.459729 0.379586
vt 0.382794 0.427997
vt 0.417893 0.433300
vt 0.452395 0.443727
vt 0.381061 0.493520
vt 0.413905 0.501491
vt 0.447002 0.508457
vt 0.376876 0.568992
vt 0.408506 0.581422
vt 0.441721 0.583721
vt 0.320768 0.227079
vt 0.202722 0.235209
vt 0.159516 0.289702
vt 0.476877 0.210594
vt 0.917583 0.227079
vt 0.799537 0.235209
vt 0.667037 0.219944
vt 0.756331 0.289702
vt 0.697186 0.285012
vt 0.100371 0.285012
vt 0.534141 0.266843
vt 0.603138 0.273163
vt 0.648165 0.313533
vt 0.706914 0.364441
vt 0.457923 0.656161
vt 0.501129 0.710653
vt 0.619175 0.718784
vt 0.398778 0.660851
vt 0.368629 0.725919
vt 0.775284 0.735269
vt 0.730623 0.660111
vt 0.349758 0.632330
vt 0.304730 0.672700
vt 0.178469 0.735269
vt 0.235733 0.679020
vn 0.4106 -0.4701 -0.7813
vn 0.0892 -0.5288 -0.8440
vn -0.2190 -0.5288 -0.8200
vn -0.5267 -0.4701 -0.7082
vn 0.4623 -0.1546 -0.8731
vn 0.0988 -0.1747 -0.9797
vn -0.2495 -0.1747 -0.9525
vn -0.5921 -0.1546 -0.7909
vn 0.4623 0.1546 -0.8731
vn 0.0988 0.1747 -0.9797
vn -0.2495 0.1747 -0.9525
vn -0.5921 0.1546 -0.7909
vn 0.4106 0.4701 -0.7813
vn 0.0892 0.5288 -0.8440
vn -0.2190 0.5288 -0.8200
vn -0.5267 0.4701 -0.7082
vn -0.7813 -0.4701 -0.4106
vn -0.8440 -0.5288 -0.0892
vn -0.8200 -0.5288 0.2190
vn -0.7082 -0.4701 0.5267
vn -0.8731 -0.1546 -0.4623
vn -0.9797 -0.1747 -0.0988
vn -0.9525 -0.1747 0.2495
vn -0.7909 -0.1546 0.5921
vn -0.8731 0.1546 -0.4623
vn -0.9797 0.1747 -0.0988
vn -0.9525 0.1747 0.2495
vn -0.7909 0.1546 0.5921
vn -0.7813 0.4701 -0.4106
vn -0.8440 0.5288 -0.0892
vn -0.8200 0.5288 0.2190
vn -0.7082 0.4701 0.5267
vn -0.4106 -0.4701 0.7813
vn -0.0892 -0.5288 0.8440
vn 0.2190 -0.5288 0.8200
vn 0.5267 -0.4701 0.7082
vn -0.4623 -0.1546 0.8731
vn -0.0988 -0.1747 0.9797
vn 0.2495 -0.1747 0.9525
vn 0.5921 -0.1546 0.7909
vn -0.4623 0.1546 0.8731
vn -0.0988 0.1747 0.9797
vn 0.2495 0.1747 0.9525
vn 0.5921 0.1546 0.7909
vn -0.4106 0.4701 0.7813
vn -0.0892 0.5288 0.8440
vn 0.2190 0.5288 0.8200
vn 0.5267 0.4701 0.7082
vn 0.7813 -0.4701 0.4106
vn 0.8440 -0.5288 0.0892
vn 0.8200 -0.5288 -0.2190
vn 0.7082 -0.4701 -0.5267
vn 0.8731 -0.1546 0.4623
vn 0.9797 -0.1747 0.0988
vn 0.9525 -0.1747 -0.2495
vn 0.7909 -0.1546 -0.5921
vn 0.8731 0.1546 0.4623
vn 0.9797 0.1747 0.0988
vn 0.9525 0.1747 -0.2495
vn 0.7909 0.1546 -0.5921
vn 0.7813 0.4701 0.4106
vn 0.8440 0.5288 0.0892
vn 0.8200 0.5288 -0.2190
vn 0.7082 0.4701 -0.5267
vn 0.5052 -0.7470 0.4321
vn 0.1952 -0.8346 0.5152
vn -0.1130 -0.8346 0.5392
vn -0.4321 -0.7470 0.5052
vn 0.5392 -0.8346 0.1130
vn 0.1877 -0.9690 0.1606
vn -0.1606 -0.9690 0.1877
vn -0.5152 -0.8346 0.1952
vn 0.5152 -0.8346 -0.1952
vn 0.1606 -0.9690 -0.1877
vn -0.1877 -0.9690 -0.1606
vn -0.5392 -0.8346 -0.1130
vn 0.4321 -0.7470 -0.5052
vn 0.1130 -0.8346 -0.5392
vn -0.1952 -0.8346 -0.5152
vn -0.5052 -0.7470 -0.4321
vn 0.4321 0.7470 -0.5052
vn 0.1130 0.8346 -0.5392
vn -0.1952 0.8346 -0.5152
vn -0.5052 0.7470 -0.4321
vn 0.5152 0.8346 -0.1952
vn 0.1606 0.9690 -0.1877
vn -0.1877 0.9690 -0.1606
vn -0.5392 0.8346 -0.1130
vn 0.5392 0.8346 0.1130
vn 0.1877 0.9690 0.1606
vn -0.1606 0.9690 0.1877
vn -0.5152 0.8346 0.1952
vn 0.5052 0.7470 0.4321
vn 0.1952 0.8346 0.5152
vn -0.1130 0.8346 0.5392
vn -0.4321 0.7470 0.5052
g bronze_bronze_bronze
usemtl bronze
s off
f 388/532/106 389/533/106 393/534/106 392/535/106
f 389/533/107 390/536/107 394/537/107 393/534/107
f 390/536/108 391/538/108 395/539/108 394/537/108
f 391/538/109 404/540/109 408/541/109 395/539/109
f 392/535/110 393/534/110 397/542/110 396/543/110
f 393/534/111 394/537/111 398/544/111 397/542/111
f 394/537/112 395/539/112 399/545/112 398/544/112
f 395/539/113 408/541/113 412/546/113 399/545/113
f 396/543/114 397/542/114 401/547/114 400/548/114
f 397/542/115 398/544/115 402/549/115 401/547/115
f 398/544/116 399/545/116 403/550/116 402/549/116
f 399/545/117 412/546/117 416/551/117 403/550/117
f 400/548/118 401/547/118 462/552/118 461/553/118
f 401/547/119 402/549/119 463/554/119 462/552/119
f 402/549/120 403/550/120 464/555/120 463/554/120
f 403/550/121 416/551/121 465/556/121 464/555/121
f 404/540/122 405/557/122 409/558/122 408/541/122
f 405/559/123 406/560/123 410/561/123 409/562/123
f 406/560/124 407/563/124 411/564/124 410/561/124
f 407/563/125 420/565/125 424/566/125 411/564/125
f 408/541/126 409/558/126 413/567/126 412/546/126
f 409/562/127 410/561/127 414/568/127 413/569/127
f 410/561/128 411/564/128 415/570/128 414/568/128
f 411/564/129 424/566/129 428/571/129 415/570/129
f 412/546/130 413/567/130 417/572/130 416/551/130
f 413/569/131 414/568/131 418/573/131 417/574/131
f 414/568/132 415/570/132 419/575/132 418/573/132
f 415/570/133 428/571/133 432/576/133 419/575/133
f 416/551/134 417/572/134 470/577/134 465/556/134
f 417/574/135 418/573/135 475/578/135 470/579/135
f 418/573/136 419/575/136 480/580/136 475/578/136
f 419/575/137 432/576/137 485/581/137 480/580/137
f 420/565/138 421/582/138 425/583/138 424/566/138
f 421/582/139 422/584/139 426/585/139 425/583/139
f 422/584/140 423/586/140 427/587/140 426/585/140
f 423/586/141 436/588/141 440/589/141 427/587/141
f 424/566/142 425/583/142 429/590/142 428/571/142
f 425/583/143 426/585/143 430/591/143 429/590/143
f 426/585/144 427/587/144 431/592/144 430/591/144
f 427/587/145 440/589/145 444/593/145 431/592/145
f 428/571/146 429/590/146 433/594/146 432/576/146
f 429/590/147 430/591/147 434/595/147 433/594/147
f 430/591/148 431/592/148 435/596/148 434/595/148
f 431/592/149 444/593/149 448/597/149 435/596/149
f 432/576/150 433/594/150 484/598/150 485/581/150
f 433/594/151 434/595/151 483/599/151 484/598/151
f 434/595/152 435/596/152 482/600/152 483/599/152
f 435/596/153 448/597/153 481/601/153 482/600/153
f 436/588/154 437/602/154 441/603/154 440/589/154
f 437/602/155 438/604/155 442/605/155 441/603/155
f 438/604/156 439/606/156 443/607/156 442/605/156
f 439/606/157 388/532/157 392/535/157 443/607/157
f 440/589/158 441/603/158 445/608/158 444/593/158
f 441/603/159 442/605/159 446/609/159 445/608/159
f 442/605/160 443/607/160 447/610/160 446/609/160
f 443/607/161 392/535/161 396/543/161 447/610/161
f 444/593/162 445/608/162 449/611/162 448/597/162
f 445/608/163 446/609/163 450/612/163 449/611/163
f 446/609/164 447/610/164 451/613/164 450/612/164
f 447/610/165 396/543/165 400/548/165 451/613/165
f 448/597/166 449/611/166 476/614/166 481/601/166
f 449/611/167 450/612/167 471/615/167 476/614/167
f 450/612/168 451/613/168 466/616/168 471/615/168
f 451/613/169 400/548/169 461/553/169 466/616/169
f 436/588/170 423/586/170 452/617/170 437/602/170
f 423/586/171 422/584/171 453/618/171 452/617/171
f 422/584/172 421/582/172 454/619/172 453/618/172
f 421/582/173 420/565/173 407/563/173 454/619/173
f 437/602/174 452/617/174 455/620/174 438/604/174
f 452/621/175 453/622/175 456/623/175 455/620/175
f 453/622/176 454/624/176 457/625/176 456/623/176
f 454/619/177 407/563/177 406/560/177 457/626/177
f 438/604/178 455/620/178 458/627/178 439/606/178
f 455/620/179 456/623/179 459/628/179 458/627/179
f 456/623/180 457/625/180 460/629/180 459/628/180
f 457/625/181 406/630/181 405/557/181 460/629/181
f 439/606/182 458/627/182 389/533/182 388/532/182
f 458/627/183 459/628/183 390/536/183 389/533/183
f 459/628/184 460/629/184 391/538/184 390/536/184
f 460/629/185 405/557/185 404/540/185 391/538/185
f 461/553/186 462/552/186 467/631/186 466/616/186
f 462/552/187 463/554/187 468/632/187 467/631/187
f 463/554/188 464/555/188 469/633/188 468/632/188
f 464/555/189 465/556/189 470/577/189 469/633/189
f 466/616/190 467/631/190 472/634/190 471/615/190
f 467/631/191 468/632/191 473/635/191 472/634/191
f 468/632/192 469/633/192 474/636/192 473/635/192
f 469/633/193 470/577/193 475/637/193 474/636/193
f 471/615/194 472/634/194 477/638/194 476/614/194
f 472/634/195 473/635/195 478/639/195 477/638/195
f 473/635/196 474/640/196 479/641/196 478/639/196
f 474/640/197 475/578/197 480/580/197 479/641/197
f 476/614/198 477/638/198 482/600/198 481/601/198
f 477/638/199 478/639/199 483/599/199 482/600/199
f 478/639/200 479/641/200 484/598/200 483/599/200
f 479/641/201 480/580/201 485/581/201 484/598/201
o copper
v 0.311802 0.108758 0.030700
v 0.284564 0.167463 0.031155
v 0.246396 0.219727 0.031627
v 0.198765 0.263540 0.032098
v 0.143502 0.297218 0.032551
v 0.082730 0.319468 0.032968
v 0.018784 0.329435 0.033332
v -0.045877 0.326734 0.033630
v -0.108770 0.311471 0.033851
v -0.167477 0.284232 0.033986
v -0.219741 0.246062 0.034029
v -0.263556 0.198431 0.033980
v -0.297236 0.143167 0.033839
v -0.319488 0.082394 0.033613
v -0.329456 0.018448 0.033310
v -0.326757 -0.046213 0.032942
v -0.311495 -0.109105 0.032522
v -0.284257 -0.167811 0.032068
v -0.246089 -0.220074 0.031596
v -0.198458 -0.263887 0.031124
v -0.143195 -0.297566 0.030671
v -0.082423 -0.319816 0.030255
v -0.018477 -0.329782 0.029890
v 0.046184 -0.327081 0.029592
v 0.109077 -0.311818 0.029371
v 0.167783 -0.284578 0.029237
v 0.220048 -0.246409 0.029193
v 0.263863 -0.198777 0.029243
v 0.297543 -0.143513 0.029383
v 0.319794 -0.082741 0.029609
v 0.329762 -0.018795 0.029912
v 0.327063 0.045866 0.030281
v 0.311496 0.109105 -0.032522
v 0.284258 0.167811 -0.032068
v 0.246090 0.220074 -0.031596
v 0.198459 0.263887 -0.031124
v 0.143196 0.297566 -0.030671
v 0.082423 0.319816 -0.030255
v 0.018478 0.329782 -0.029890
v -0.046184 0.327082 -0.029592
v -0.109076 0.311818 -0.029371
v -0.167783 0.284579 -0.029237
v -0.220048 0.246410 -0.029193
v -0.263862 0.198778 -0.029243
v -0.297542 0.143514 -0.029383
v -0.319794 0.082741 -0.029609
v -0.329762 0.018796 -0.029912
v -0.327063 -0.045865 -0.030281
v -0.311802 -0.108757 -0.030700
v -0.284563 -0.167463 -0.031155
v -0.246395 -0.219727 -0.031627
v -0.198765 -0.263540 -0.032098
v -0.143501 -0.297218 -0.032551
v -0.082729 -0.319468 -0.032968
v -0.018784 -0.329434 -0.033332
v 0.045878 -0.326734 -0.033630
v 0.108771 -0.311471 -0.033851
v 0.167477 -0.284231 -0.033986
v 0.219742 -0.246062 -0.034029
v 0.263556 -0.198430 -0.033980
v 0.297236 -0.143166 -0.033839
v 0.319488 -0.082393 -0.033613
v 0.329456 -0.018448 -0.033310
v 0.326757 0.046214 -0.032942
v 0.335402 0.117006 0.030631
v 0.306101 0.180157 0.031120
v 0.265042 0.236379 0.031628
v 0.213805 0.283509 0.032135
v 0.154357 0.319738 0.032622
v 0.088983 0.343673 0.033070
v 0.020195 0.354394 0.033462
v -0.049363 0.351489 0.033783
v -0.117018 0.335071 0.034021
v -0.180170 0.305768 0.034166
v -0.236393 0.264708 0.034212
v -0.283525 0.213470 0.034159
v -0.319755 0.154021 0.034008
v -0.343692 0.088646 0.033765
v -0.354415 0.019858 0.033439
v -0.351512 -0.049699 0.033042
v -0.335095 -0.117354 0.032591
v -0.305794 -0.180505 0.032102
v -0.264736 -0.236726 0.031594
v -0.213498 -0.283857 0.031087
v -0.154050 -0.320085 0.030600
v -0.088676 -0.344020 0.030152
v -0.019888 -0.354741 0.029760
v 0.049670 -0.351836 0.029439
v 0.117325 -0.335418 0.029202
v 0.180477 -0.306115 0.029057
v 0.236699 -0.265055 0.029010
v 0.283832 -0.213816 0.029063
v 0.320062 -0.154367 0.029214
v 0.343999 -0.088993 0.029458
v 0.354721 -0.020205 0.029784
v 0.351818 0.049353 0.030180
v 0.335095 0.117354 -0.032591
v 0.305795 0.180505 -0.032102
v 0.264736 0.236726 -0.031594
v 0.213498 0.283857 -0.031087
v 0.154050 0.320085 -0.030600
v 0.088676 0.344020 -0.030152
v 0.019889 0.354741 -0.029760
v -0.049670 0.351837 -0.029439
v -0.117324 0.335418 -0.029202
v -0.180476 0.306116 -0.029057
v -0.236699 0.265056 -0.029010
v -0.283831 0.213817 -0.029063
v -0.320061 0.154368 -0.029215
v -0.343998 0.088994 -0.029458
v -0.354721 0.020206 -0.029784
v -0.351818 -0.049352 -0.030180
v -0.335401 -0.117006 -0.030631
v -0.306100 -0.180157 -0.031120
v -0.265042 -0.236378 -0.031628
v -0.213804 -0.283509 -0.032135
v -0.154356 -0.319738 -0.032622
v -0.088982 -0.343673 -0.033070
v -0.020194 -0.354394 -0.033462
v 0.049364 -0.351489 -0.033783
v 0.117019 -0.335070 -0.034021
v 0.180171 -0.305768 -0.034166
v 0.236393 -0.264708 -0.034212
v 0.283525 -0.213469 -0.034159
v 0.319756 -0.154020 -0.034008
v 0.343692 -0.088646 -0.033765
v 0.354415 -0.019858 -0.033439
v 0.351512 0.049700 -0.033042
v -0.285966 0.036617 -0.253880
v -0.330001 0.036617 -0.193213
v -0.361354 0.036617 -0.125120
v -0.378821 0.036617 -0.052219
v -0.381729 0.036617 0.022688
v -0.369968 0.036617 0.096724
v -0.343989 0.036617 0.167043
v -0.304791 0.036617 0.230942
v -0.253880 0.036617 0.285966
v -0.193213 0.036617 0.330001
v -0.125120 0.036617 0.361354
v -0.052220 0.036617 0.378820
v 0.022688 0.036617 0.381729
v 0.096724 0.036617 0.369968
v 0.167042 0.036617 0.343989
v 0.230942 0.036617 0.304791
v 0.285966 0.036617 0.253880
v 0.330001 0.036617 0.193213
v 0.361354 0.036617 0.125120
v 0.378820 0.036617 0.052219
v 0.381729 0.036617 -0.022689
v 0.369968 0.036617 -0.096724
v 0.343989 0.036617 -0.167043
v 0.304791 0.036617 -0.230942
v 0.253880 0.036617 -0.285967
v 0.193212 0.036617 -0.330001
v 0.125120 0.036617 -0.361354
v 0.052219 0.036617 -0.378821
v -0.022689 0.036617 -0.381729
v -0.096725 0.036617 -0.369968
v -0.167043 0.036617 -0.343989
v -0.230942 0.036617 -0.304791
v -0.285966 -0.036617 -0.253880
v -0.330001 -0.036617 -0.193213
v -0.361354 -0.036617 -0.125120
v -0.378821 -0.036617 -0.052219
v -0.381729 -0.036617 0.022688
v -0.369968 -0.036617 0.096724
v -0.343989 -0.036617 0.167043
v -0.304791 -0.036617 0.230942
v -0.253880 -0.036617 0.285966
v -0.193213 -0.036617 0.330001
v -0.125120 -0.036617 0.361354
v -0.052220 -0.036617 0.378820
v 0.022688 -0.036617 0.381729
v 0.096724 -0.036617 0.369968
v 0.167042 -0.036617 0.343989
v 0.230942 -0.036617 0.304791
v 0.285966 -0.036617 0.253880
v 0.330001 -0.036617 0.193213
v 0.361354 -0.036617 0.125120
v 0.378820 -0.036617 0.052219
v 0.381729 -0.036617 -0.022689
v 0.369968 -0.036617 -0.096724
v 0.343989 -0.036617 -0.167043
v 0.304791 -0.036617 -0.230942
v 0.253880 -0.036617 -0.285966
v 0.193212 -0.036617 -0.330001
v 0.125120 -0.036617 -0.361354
v 0.052219 -0.036617 -0.378821
v -0.022689 -0.036617 -0.381729
v -0.096725 -0.036617 -0.369968
v -0.167043 -0.036617 -0.343989
v -0.230942 -0.036617 -0.304791
v -0.300923 0.036617 -0.267158
v -0.347260 0.036617 -0.203318
v -0.380253 0.036617 -0.131664
v -0.398633 0.036617 -0.054950
v -0.401693 0.036617 0.023875
v -0.389317 0.036617 0.101782
v -0.361980 0.036617 0.175779
v -0.320732 0.036617 0.243020
v -0.267159 0.036617 0.300922
v -0.203318 0.036616 0.347260
v -0.131664 0.036617 0.380253
v -0.054951 0.036616 0.398632
v 0.023875 0.036617 0.401693
v 0.101782 0.036616 0.389317
v 0.175779 0.036617 0.361980
v 0.243020 0.036617 0.320732
v 0.300922 0.036617 0.267158
v 0.347260 0.036617 0.203318
v 0.380253 0.036617 0.131664
v 0.398632 0.036617 0.054950
v 0.401693 0.036617 -0.023875
v 0.389317 0.036617 -0.101783
v 0.361979 0.036617 -0.175779
v 0.320731 0.036617 -0.243021
v 0.267158 0.036617 -0.300923
v 0.203317 0.036617 -0.347260
v 0.131663 0.036617 -0.380253
v 0.054950 0.036617 -0.398633
v -0.023875 0.036617 -0.401693
v -0.101783 0.036617 -0.389317
v -0.175779 0.036617 -0.361979
v -0.243021 0.036617 -0.320731
v -0.300923 -0.036617 -0.267158
v -0.347260 -0.036617 -0.203318
v -0.380253 -0.036617 -0.131664
v -0.398633 -0.036617 -0.054950
v -0.401693 -0.036617 0.023875
v -0.389317 -0.036617 0.101782
v -0.361980 -0.036617 0.175779
v -0.320732 -0.036617 0.243020
v -0.267159 -0.036617 0.300922
v -0.203318 -0.036617 0.347260
v -0.131664 -0.036617 0.380253
v -0.054951 -0.036617 0.398633
v 0.023875 -0.036617 0.401693
v 0.101782 -0.036617 0.389317
v 0.175779 -0.036617 0.361980
v 0.243020 -0.036617 0.320732
v 0.300922 -0.036617 0.267158
v 0.347260 -0.036617 0.203318
v 0.380252 -0.036617 0.131664
v 0.398632 -0.036617 0.054950
v 0.401693 -0.036617 -0.023875
v 0.389317 -0.036617 -0.101783
v 0.361979 -0.036617 -0.175779
v 0.320731 -0.036617 -0.243021
v 0.267158 -0.036617 -0.300923
v 0.203317 -0.036617 -0.347260
v 0.131663 -0.036617 -0.380253
v 0.054950 -0.036617 -0.398633
v -0.023875 -0.036617 -0.401693
v -0.101783 -0.036617 -0.389317
v -0.175779 -0.036617 -0.361979
v -0.243021 -0.036617 -0.320731
v -0.004523 0.247626 -0.255435
v -0.003788 0.292526 -0.202484
v -0.001613 0.326284 -0.141853
v 0.001921 0.347600 -0.075871
v 0.006676 0.355656 -0.007075
v 0.012471 0.350142 0.061892
v 0.019082 0.331271 0.128379
v 0.026255 0.299767 0.189832
v 0.033715 0.256841 0.243889
v 0.041175 0.204143 0.288472
v 0.048348 0.143697 0.321868
v 0.054959 0.077827 0.342794
v 0.060753 0.009065 0.350446
v 0.065509 -0.059948 0.344529
v 0.069042 -0.126559 0.325271
v 0.071218 -0.188209 0.293412
v 0.071953 -0.242528 0.250177
v 0.071218 -0.287429 0.197226
v 0.069042 -0.321186 0.136595
v 0.065508 -0.342502 0.070613
v 0.060753 -0.350559 0.001817
v 0.054959 -0.345045 -0.067150
v 0.048348 -0.326173 -0.133638
v 0.041175 -0.294669 -0.195090
v 0.033715 -0.251743 -0.249147
v 0.026255 -0.199045 -0.293730
v 0.019082 -0.138599 -0.327127
v 0.012471 -0.072730 -0.348053
v 0.006676 -0.003967 -0.355704
v 0.001921 0.065046 -0.349787
v -0.001613 0.131657 -0.330529
v -0.003789 0.193307 -0.298670
v -0.071953 0.242529 -0.250177
v -0.071218 0.287429 -0.197226
v -0.069042 0.321187 -0.136595
v -0.065509 0.342503 -0.070613
v -0.060753 0.350559 -0.001817
v -0.054959 0.345045 0.067150
v -0.048348 0.326174 0.133637
v -0.041175 0.294670 0.195090
v -0.033715 0.251744 0.249147
v -0.026255 0.199046 0.293730
v -0.019082 0.138600 0.327126
v -0.012471 0.072730 0.348052
v -0.006676 0.003968 0.355704
v -0.001921 -0.065045 0.349787
v 0.001612 -0.131657 0.330529
v 0.003788 -0.193306 0.298670
v 0.004523 -0.247625 0.255434
v 0.003788 -0.292526 0.202484
v 0.001612 -0.326283 0.141852
v -0.001921 -0.347600 0.075871
v -0.006677 -0.355656 0.007075
v -0.012471 -0.350142 -0.061892
v -0.019082 -0.331270 -0.128380
v -0.026255 -0.299766 -0.189833
v -0.033715 -0.256840 -0.243889
v -0.041175 -0.204142 -0.288472
v -0.048348 -0.143696 -0.321869
v -0.054959 -0.077827 -0.342795
v -0.060753 -0.009064 -0.350446
v -0.065509 0.059949 -0.344529
v -0.069042 0.126560 -0.325271
v -0.071218 0.188210 -0.293412
v -0.006683 0.261465 -0.269711
v -0.005906 0.308901 -0.213770
v -0.003607 0.344565 -0.149715
v 0.000126 0.367085 -0.080007
v 0.005150 0.375595 -0.007326
v 0.011271 0.369770 0.065535
v 0.018255 0.349833 0.135777
v 0.025834 0.316550 0.200701
v 0.033715 0.271201 0.257810
v 0.041596 0.215527 0.304910
v 0.049174 0.151668 0.340192
v 0.056158 0.082078 0.362300
v 0.062280 0.009433 0.370384
v 0.067304 -0.063477 0.364133
v 0.071037 -0.133850 0.343787
v 0.073336 -0.198981 0.310129
v 0.074112 -0.256367 0.264452
v 0.073336 -0.303804 0.208512
v 0.071037 -0.339467 0.144456
v 0.067304 -0.361987 0.074749
v 0.062280 -0.370498 0.002068
v 0.056158 -0.364673 -0.070793
v 0.049174 -0.344736 -0.141035
v 0.041596 -0.311453 -0.205959
v 0.033715 -0.266103 -0.263068
v 0.025834 -0.210429 -0.310168
v 0.018255 -0.146570 -0.345450
v 0.011271 -0.076980 -0.367558
v 0.005150 -0.004335 -0.375642
v 0.000126 0.068575 -0.369391
v -0.003607 0.138948 -0.349045
v -0.005906 0.204079 -0.315387
v -0.074112 0.256368 -0.264453
v -0.073336 0.303804 -0.208512
v -0.071037 0.339468 -0.144457
v -0.067304 0.361987 -0.074749
v -0.062280 0.370498 -0.002068
v -0.056158 0.364673 0.070793
v -0.049174 0.344736 0.141035
v -0.041596 0.311453 0.205958
v -0.033715 0.266104 0.263068
v -0.025834 0.210430 0.310168
v -0.018255 0.146571 0.345450
v -0.011271 0.076981 0.367558
v -0.005150 0.004336 0.375641
v -0.000126 -0.068574 0.369391
v 0.003607 -0.138947 0.349045
v 0.005906 -0.204078 0.315387
v 0.006682 -0.261464 0.269710
v 0.005906 -0.308901 0.213769
v 0.003607 -0.344564 0.149714
v -0.000126 -0.367084 0.080007
v -0.005150 -0.375595 0.007326
v -0.011271 -0.369770 -0.065536
v -0.018256 -0.349833 -0.135778
v -0.025834 -0.316550 -0.200701
v -0.033715 -0.271200 -0.257810
v -0.041596 -0.215526 -0.304911
v -0.049174 -0.151667 -0.340193
v -0.056158 -0.082078 -0.362300
v -0.062280 -0.009432 -0.370384
v -0.067304 0.063478 -0.364133
v -0.071037 0.133851 -0.343787
v -0.073336 0.198982 -0.310129
vt 0.926035 0.627582
vt 0.893852 0.630339
vt 0.894026 0.578467
vt 0.922967 0.575988
vt 0.438346 0.355695
vt 0.410006 0.364110
vt 0.403735 0.313455
vt 0.434948 0.304165
vt 0.103843 0.618889
vt 0.072497 0.627582
vt 0.069430 0.575988
vt 0.097852 0.568121
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.746656 0.562530
vt 0.758131 0.515591
vt 0.783200 0.536323
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.307238 0.438743
vt 0.295030 0.392744
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.331362 0.415507
vt 0.319887 0.368568
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.356431 0.394775
vt 0.346128 0.346637
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.926035 0.627582
vt 0.922967 0.575988
vt 0.894026 0.578467
vt 0.893852 0.630339
vt 0.438346 0.355695
vt 0.434948 0.304165
vt 0.403735 0.313455
vt 0.410006 0.364110
vt 0.103843 0.618889
vt 0.097852 0.568121
vt 0.069430 0.575988
vt 0.072497 0.627582
vt 0.467257 0.352631
vt 0.467083 0.300759
vt 0.133709 0.604924
vt 0.125336 0.555342
vt 0.496198 0.355111
vt 0.499266 0.303516
vt 0.161818 0.586615
vt 0.151669 0.538341
vt 0.524621 0.362977
vt 0.530612 0.312209
vt 0.188225 0.564978
vt 0.176852 0.517923
vt 0.552105 0.375757
vt 0.560478 0.326175
vt 0.213211 0.540997
vt 0.201064 0.494914
vt 0.578438 0.392757
vt 0.588587 0.344483
vt 0.237170 0.515577
vt 0.224597 0.470120
vt 0.603621 0.413175
vt 0.614994 0.366120
vt 0.260539 0.489545
vt 0.247823 0.444317
vt 0.627832 0.436184
vt 0.639980 0.390101
vt 0.283756 0.463680
vt 0.271155 0.418267
vt 0.772897 0.584461
vt 0.783200 0.536323
vt 0.758131 0.515591
vt 0.746656 0.562530
vt 0.651366 0.460978
vt 0.663939 0.415522
vt 0.307238 0.438743
vt 0.295030 0.392744
vt 0.800818 0.603170
vt 0.809407 0.553725
vt 0.674592 0.486781
vt 0.687308 0.441553
vt 0.331362 0.415507
vt 0.319887 0.368568
vt 0.830504 0.617643
vt 0.836775 0.566988
vt 0.697924 0.512831
vt 0.710524 0.467418
vt 0.356431 0.394775
vt 0.346128 0.346637
vt 0.861717 0.626933
vt 0.865115 0.575403
vt 0.721799 0.538355
vt 0.734007 0.492355
vt 0.382638 0.377373
vt 0.374049 0.327928
vt 0.924091 0.586444
vt 0.892918 0.585851
vt 0.894928 0.557945
vt 0.923274 0.558538
vt 0.441148 0.445412
vt 0.413778 0.451403
vt 0.406874 0.423497
vt 0.436498 0.417506
vt 0.103579 0.584252
vt 0.072609 0.586444
vt 0.071793 0.558538
vt 0.100013 0.556346
vt 0.469187 0.442055
vt 0.467178 0.414149
vt 0.133706 0.579358
vt 0.127704 0.551452
vt 0.497534 0.441462
vt 0.498350 0.413556
vt 0.162562 0.571951
vt 0.154580 0.544045
vt 0.525754 0.443654
vt 0.529319 0.415748
vt 0.189994 0.562315
vt 0.180522 0.534409
vt 0.553444 0.448548
vt 0.559446 0.420642
vt 0.216083 0.550821
vt 0.205574 0.522915
vt 0.580321 0.455955
vt 0.588303 0.428049
vt 0.241073 0.537909
vt 0.229909 0.510003
vt 0.606263 0.465591
vt 0.615735 0.437685
vt 0.265296 0.524077
vt 0.253797 0.496171
vt 0.631314 0.477085
vt 0.641824 0.449179
vt 0.289121 0.509856
vt 0.277565 0.481950
vt 0.777520 0.557633
vt 0.751935 0.545479
vt 0.762765 0.517573
vt 0.787484 0.529727
vt 0.655650 0.489997
vt 0.666813 0.462091
vt 0.312916 0.495793
vt 0.301574 0.467887
vt 0.804360 0.568109
vt 0.813034 0.540203
vt 0.679538 0.503829
vt 0.691037 0.475923
vt 0.337024 0.482427
vt 0.326194 0.454521
vt 0.832615 0.576503
vt 0.839518 0.548597
vt 0.703306 0.518050
vt 0.714862 0.490144
vt 0.361744 0.470273
vt 0.351780 0.442367
vt 0.862238 0.582494
vt 0.866888 0.554588
vt 0.727314 0.532113
vt 0.738656 0.504207
vt 0.387294 0.459797
vt 0.378619 0.431891
vt 0.924091 0.586444
vt 0.923274 0.558538
vt 0.894928 0.557945
vt 0.892918 0.585851
vt 0.441148 0.445412
vt 0.436498 0.417506
vt 0.406874 0.423497
vt 0.413778 0.451403
vt 0.103579 0.584252
vt 0.100013 0.556346
vt 0.071793 0.558538
vt 0.072609 0.586444
vt 0.469187 0.442055
vt 0.467178 0.414149
vt 0.133706 0.579358
vt 0.127704 0.551452
vt 0.497534 0.441462
vt 0.498350 0.413556
vt 0.162562 0.571951
vt 0.154580 0.544045
vt 0.525754 0.443654
vt 0.529319 0.415748
vt 0.189994 0.562315
vt 0.180522 0.534409
vt 0.553444 0.448548
vt 0.559446 0.420642
vt 0.216083 0.550821
vt 0.205574 0.522915
vt 0.580321 0.455955
vt 0.588303 0.428049
vt 0.241073 0.537909
vt 0.229909 0.510003
vt 0.606263 0.465591
vt 0.615735 0.437685
vt 0.265296 0.524077
vt 0.253797 0.496171
vt 0.631314 0.477085
vt 0.641824 0.449179
vt 0.289121 0.509856
vt 0.277565 0.481950
vt 0.777520 0.557633
vt 0.787484 0.529727
vt 0.762765 0.517573
vt 0.751935 0.545479
vt 0.655650 0.489997
vt 0.666813 0.462091
vt 0.312916 0.495793
vt 0.301574 0.467887
vt 0.804360 0.568109
vt 0.813034 0.540203
vt 0.679538 0.503829
vt 0.691037 0.475923
vt 0.337024 0.482427
vt 0.326194 0.454521
vt 0.832615 0.576503
vt 0.839518 0.548597
vt 0.703306 0.518050
vt 0.714862 0.490144
vt 0.361744 0.470273
vt 0.351780 0.442367
vt 0.862238 0.582494
vt 0.866888 0.554588
vt 0.727314 0.532113
vt 0.738656 0.504207
vt 0.387294 0.459797
vt 0.378619 0.431891
vt 0.921167 0.578126
vt 0.890749 0.577589
vt 0.892709 0.552369
vt 0.920370 0.552905
vt 0.449904 0.450665
vt 0.423196 0.456079
vt 0.416459 0.430859
vt 0.445366 0.425445
vt 0.120498 0.576144
vt 0.090278 0.578126
vt 0.089481 0.552905
vt 0.117019 0.550924
vt 0.477265 0.447631
vt 0.475304 0.422411
vt 0.149897 0.571722
vt 0.144040 0.546501
vt 0.504926 0.447095
vt 0.505722 0.421874
vt 0.178056 0.565027
vt 0.170266 0.539807
vt 0.532464 0.449076
vt 0.535943 0.423856
vt 0.204824 0.556319
vt 0.195581 0.531098
vt 0.559484 0.453499
vt 0.565341 0.428278
vt 0.230282 0.545930
vt 0.220027 0.520710
vt 0.585711 0.460193
vt 0.593500 0.434973
vt 0.254667 0.534261
vt 0.243774 0.509041
vt 0.611026 0.468902
vt 0.620269 0.443681
vt 0.278305 0.521760
vt 0.267084 0.496540
vt 0.635471 0.479290
vt 0.645726 0.454070
vt 0.301554 0.508908
vt 0.290277 0.483687
vt 0.778141 0.552087
vt 0.753175 0.541103
vt 0.763743 0.515882
vt 0.787864 0.526867
vt 0.659218 0.490959
vt 0.670112 0.465739
vt 0.324773 0.496198
vt 0.313705 0.470977
vt 0.804332 0.561555
vt 0.812796 0.536334
vt 0.682529 0.503460
vt 0.693750 0.478240
vt 0.348298 0.484118
vt 0.337730 0.458897
vt 0.831903 0.569141
vt 0.838640 0.543921
vt 0.705722 0.516313
vt 0.716998 0.491092
vt 0.372420 0.473133
vt 0.362697 0.447913
vt 0.860811 0.574555
vt 0.865348 0.549335
vt 0.729150 0.529023
vt 0.740217 0.503803
vt 0.397352 0.463666
vt 0.388887 0.438445
vt 0.921167 0.578126
vt 0.920370 0.552905
vt 0.892709 0.552369
vt 0.890749 0.577589
vt 0.449904 0.450665
vt 0.445366 0.425445
vt 0.416459 0.430859
vt 0.423196 0.456079
vt 0.120498 0.576144
vt 0.117019 0.550924
vt 0.089481 0.552905
vt 0.090278 0.578126
vt 0.477265 0.447631
vt 0.475304 0.422411
vt 0.149897 0.571722
vt 0.144040 0.546501
vt 0.504926 0.447095
vt 0.505722 0.421874
vt 0.178056 0.565027
vt 0.170266 0.539807
vt 0.532464 0.449076
vt 0.535943 0.423856
vt 0.204824 0.556319
vt 0.195581 0.531098
vt 0.559484 0.453499
vt 0.565341 0.428278
vt 0.230282 0.545930
vt 0.220027 0.520710
vt 0.585711 0.460193
vt 0.593500 0.434973
vt 0.254667 0.534261
vt 0.243774 0.509041
vt 0.611026 0.468902
vt 0.620269 0.443681
vt 0.278305 0.521760
vt 0.267084 0.496540
vt 0.635471 0.479290
vt 0.645726 0.454070
vt 0.301554 0.508908
vt 0.290277 0.483687
vt 0.778141 0.552087
vt 0.787864 0.526867
vt 0.763743 0.515882
vt 0.753175 0.541103
vt 0.659218 0.490959
vt 0.670112 0.465739
vt 0.324773 0.496198
vt 0.313705 0.470977
vt 0.804332 0.561555
vt 0.812796 0.536334
vt 0.682529 0.503460
vt 0.693750 0.478240
vt 0.348298 0.484118
vt 0.337730 0.458897
vt 0.831903 0.569141
vt 0.838640 0.543921
vt 0.705722 0.516313
vt 0.716998 0.491092
vt 0.372420 0.473133
vt 0.362697 0.447913
vt 0.860811 0.574555
vt 0.865348 0.549335
vt 0.729150 0.529023
vt 0.740217 0.503803
vt 0.397352 0.463666
vt 0.388887 0.438445
vn 0.1540 0.9881 0.0047
vn -0.5204 -0.8539 -0.0022
vn -0.0417 0.9991 0.0057
vn -0.3438 -0.9390 -0.0035
vn -0.2358 0.9718 0.0065
vn -0.1540 -0.9881 -0.0047
vn -0.4209 0.9071 0.0070
vn 0.0417 -0.9991 -0.0057
vn -0.5898 0.8076 0.0073
vn 0.2358 -0.9718 -0.0065
vn -0.7360 0.6770 0.0073
vn 0.4209 -0.9071 -0.0070
vn -0.8539 0.5204 0.0070
vn 0.5898 -0.8076 -0.0073
vn -0.9390 0.3438 0.0064
vn 0.7360 -0.6770 -0.0073
vn -0.9881 0.1540 0.0056
vn 0.9071 0.4209 -0.0021
vn 0.8539 -0.5204 -0.0070
vn -0.9991 -0.0417 0.0046
vn 0.8076 0.5898 -0.0007
vn 0.9390 -0.3438 -0.0064
vn -0.9718 -0.2358 0.0034
vn 0.6770 0.7360 0.0008
vn 0.9881 -0.1540 -0.0056
vn -0.9071 -0.4209 0.0021
vn 0.5204 0.8539 0.0022
vn 0.9991 0.0417 -0.0046
vn -0.8076 -0.5898 0.0007
vn 0.3438 0.9390 0.0035
vn 0.9718 0.2358 -0.0034
vn -0.6770 -0.7360 -0.0008
vn 0.5898 -0.8075 -0.0073
vn -0.5898 0.8075 0.0073
vn -0.0048 0.0055 -1.0000
vn 0.0048 -0.0055 1.0000
vn -0.9380 0.0000 0.3465
vn 0.9992 0.0000 0.0388
vn -0.8524 0.0000 0.5229
vn 0.9876 -0.0000 -0.1569
vn -0.7340 0.0000 0.6791
vn 0.9380 0.0000 -0.3466
vn -0.5874 0.0000 0.8093
vn 0.8524 -0.0000 -0.5229
vn -0.4182 0.0000 0.9083
vn 0.7340 -0.0000 -0.6791
vn -0.2330 0.0000 0.9725
vn 0.5874 -0.0000 -0.8093
vn -0.0388 0.0000 0.9992
vn 0.4182 0.0000 -0.9083
vn 0.1569 0.0000 0.9876
vn 0.2330 -0.0000 -0.9725
vn 0.3465 0.0000 0.9380
vn -0.8093 -0.0000 -0.5874
vn 0.0388 0.0000 -0.9992
vn 0.5229 0.0000 0.8524
vn -0.9083 0.0000 -0.4182
vn -0.1569 0.0000 -0.9876
vn 0.6791 0.0000 0.7340
vn -0.9725 0.0000 -0.2330
vn -0.3466 -0.0000 -0.9380
vn 0.8093 -0.0000 0.5874
vn -0.9992 0.0000 -0.0388
vn -0.5229 -0.0000 -0.8524
vn 0.9083 -0.0000 0.4182
vn -0.9876 0.0000 0.1569
vn -0.6791 0.0000 -0.7340
vn 0.9725 -0.0000 0.2330
vn 0.9380 0.0000 -0.3465
vn -0.9380 0.0000 0.3466
vn -0.3465 -0.0000 -0.9380
vn 0.3466 0.0000 0.9380
vn 0.0000 -1.0000 0.0000
vn -0.0000 1.0000 -0.0000
vn -0.0509 0.9594 0.2774
vn 0.0835 -0.9904 0.1102
vn -0.0313 0.8880 0.4589
vn 0.0685 -0.9940 -0.0852
vn -0.0106 0.7824 0.6227
vn 0.0509 -0.9594 -0.2774
vn 0.0106 0.6467 0.7627
vn 0.0313 -0.8880 -0.4589
vn 0.0313 0.4862 0.8733
vn 0.0106 -0.7824 -0.6227
vn 0.0509 0.3070 0.9503
vn -0.0106 -0.6467 -0.7627
vn 0.0685 0.1160 0.9909
vn -0.0313 -0.4862 -0.8733
vn 0.0835 -0.0794 0.9933
vn -0.0509 -0.3070 -0.9503
vn 0.0952 -0.2718 0.9576
vn -0.1074 0.7590 -0.6421
vn -0.0685 -0.1160 -0.9909
vn 0.1033 -0.4538 0.8851
vn -0.1033 0.8706 -0.4810
vn -0.0835 0.0794 -0.9933
vn 0.1074 -0.6183 0.7786
vn -0.0952 0.9487 -0.3014
vn -0.0952 0.2718 -0.9576
vn 0.1074 -0.7590 0.6421
vn -0.0835 0.9904 -0.1102
vn -0.1033 0.4538 -0.8851
vn 0.1033 -0.8706 0.4810
vn -0.0685 0.9940 0.0852
vn -0.1074 0.6183 -0.7786
vn 0.0952 -0.9487 0.3014
vn -0.9942 -0.0751 0.0775
vn 0.9942 0.0751 -0.0775
g copper_copper_copper
usemtl copper
s off
f 492/642/202 491/643/202 523/644/202 524/645/202
f 506/646/203 505/647/203 537/648/203 538/649/203
f 493/650/204 492/651/204 524/652/204 525/653/204
f 507/654/205 506/646/205 538/649/205 539/655/205
f 494/656/206 493/650/206 525/653/206 526/657/206
f 508/658/207 507/654/207 539/655/207 540/659/207
f 495/660/208 494/656/208 526/657/208 527/661/208
f 509/662/209 508/658/209 540/659/209 541/663/209
f 496/664/210 495/660/210 527/661/210 528/665/210
f 510/666/211 509/662/211 541/663/211 542/667/211
f 497/668/212 496/664/212 528/665/212 529/669/212
f 511/670/213 510/666/213 542/667/213 543/671/213
f 498/672/214 497/668/214 529/669/214 530/673/214
f 512/674/215 511/670/215 543/671/215 544/675/215
f 499/676/216 498/672/216 530/673/216 531/677/216
f 513/678/217 512/674/217 544/675/217 545/679/217
f 500/680/218 499/676/218 531/677/218 532/681/218
f 487/682/219 486/683/219 518/684/219 519/685/219
f 514/686/220 513/678/220 545/679/220 546/687/220
f 501/688/221 500/680/221 532/681/221 533/689/221
f 488/690/222 487/682/222 519/685/222 520/691/222
f 515/692/223 514/686/223 546/687/223 547/693/223
f 502/694/224 501/688/224 533/689/224 534/695/224
f 489/696/225 488/690/225 520/691/225 521/697/225
f 516/698/226 515/692/226 547/693/226 548/699/226
f 503/700/227 502/694/227 534/695/227 535/701/227
f 490/702/228 489/696/228 521/697/228 522/703/228
f 517/704/229 516/698/229 548/699/229 549/705/229
f 504/706/230 503/700/230 535/701/230 536/707/230
f 491/643/231 490/702/231 522/703/231 523/644/231
f 486/683/232 517/704/232 549/705/232 518/684/232
f 505/647/233 504/706/233 536/707/233 537/648/233
f 556/708/207 588/709/207 587/710/207 555/711/207
f 570/712/228 602/713/228 601/714/228 569/715/228
f 557/716/209 589/717/209 588/718/209 556/719/209
f 571/720/231 603/721/231 602/713/231 570/712/231
f 558/722/211 590/723/211 589/717/211 557/716/211
f 572/724/202 604/725/202 603/721/202 571/720/202
f 559/726/213 591/727/213 590/723/213 558/722/213
f 573/728/204 605/729/204 604/725/204 572/724/204
f 560/730/234 592/731/234 591/727/234 559/726/234
f 574/732/206 606/733/206 605/729/206 573/728/206
f 561/734/217 593/735/217 592/731/217 560/730/217
f 575/736/208 607/737/208 606/733/208 574/732/208
f 562/738/220 594/739/220 593/735/220 561/734/220
f 576/740/235 608/741/235 607/737/235 575/736/235
f 563/742/223 595/743/223 594/739/223 562/738/223
f 577/744/212 609/745/212 608/741/212 576/740/212
f 564/746/226 596/747/226 595/743/226 563/742/226
f 551/748/227 583/749/227 582/750/227 550/751/227
f 578/752/214 610/753/214 609/745/214 577/744/214
f 565/754/229 597/755/229 596/747/229 564/746/229
f 552/756/230 584/757/230 583/749/230 551/748/230
f 579/758/216 611/759/216 610/753/216 578/752/216
f 566/760/232 598/761/232 597/755/232 565/754/232
f 553/762/233 585/763/233 584/757/233 552/756/233
f 580/764/218 612/765/218 611/759/218 579/758/218
f 567/766/219 599/767/219 598/761/219 566/760/219
f 554/768/203 586/769/203 585/763/203 553/762/203
f 581/770/221 613/771/221 612/765/221 580/764/221
f 568/772/222 600/773/222 599/767/222 567/766/222
f 555/711/205 587/710/205 586/769/205 554/768/205
f 550/751/224 582/750/224 613/771/224 581/770/224
f 569/715/225 601/714/225 600/773/225 568/772/225
f 486/683/236 487/682/236 551/748/236 550/751/236
f 487/682/236 488/690/236 552/756/236 551/748/236
f 488/690/236 489/696/236 553/762/236 552/756/236
f 489/696/236 490/702/236 554/768/236 553/762/236
f 490/702/236 491/643/236 555/711/236 554/768/236
f 491/643/236 492/642/236 556/708/236 555/711/236
f 492/651/236 493/650/236 557/716/236 556/719/236
f 493/650/236 494/656/236 558/722/236 557/716/236
f 494/656/236 495/660/236 559/726/236 558/722/236
f 495/660/236 496/664/236 560/730/236 559/726/236
f 496/664/236 497/668/236 561/734/236 560/730/236
f 497/668/236 498/672/236 562/738/236 561/734/236
f 498/672/236 499/676/236 563/742/236 562/738/236
f 499/676/236 500/680/236 564/746/236 563/742/236
f 500/680/236 501/688/236 565/754/236 564/746/236
f 501/688/236 502/694/236 566/760/236 565/754/236
f 502/694/236 503/700/236 567/766/236 566/760/236
f 503/700/236 504/706/236 568/772/236 567/766/236
f 504/706/236 505/647/236 569/715/236 568/772/236
f 505/647/236 506/646/236 570/712/236 569/715/236
f 506/646/236 507/654/236 571/720/236 570/712/236
f 507/654/236 508/658/236 572/724/236 571/720/236
f 508/658/236 509/662/236 573/728/236 572/724/236
f 509/662/236 510/666/236 574/732/236 573/728/236
f 510/666/236 511/670/236 575/736/236 574/732/236
f 511/670/236 512/674/236 576/740/236 575/736/236
f 512/674/236 513/678/236 577/744/236 576/740/236
f 513/678/236 514/686/236 578/752/236 577/744/236
f 514/686/236 515/692/236 579/758/236 578/752/236
f 515/692/236 516/698/236 580/764/236 579/758/236
f 516/698/236 517/704/236 581/770/236 580/764/236
f 517/704/236 486/683/236 550/751/236 581/770/236
f 519/685/237 518/684/237 582/750/237 583/749/237
f 520/691/237 519/685/237 583/749/237 584/757/237
f 521/697/237 520/691/237 584/757/237 585/763/237
f 522/703/237 521/697/237 585/763/237 586/769/237
f 523/644/237 522/703/237 586/769/237 587/710/237
f 524/645/237 523/644/237 587/710/237 588/709/237
f 525/653/237 524/652/237 588/718/237 589/717/237
f 526/657/237 525/653/237 589/717/237 590/723/237
f 527/661/237 526/657/237 590/723/237 591/727/237
f 528/665/237 527/661/237 591/727/237 592/731/237
f 529/669/237 528/665/237 592/731/237 593/735/237
f 530/673/237 529/669/237 593/735/237 594/739/237
f 531/677/237 530/673/237 594/739/237 595/743/237
f 532/681/237 531/677/237 595/743/237 596/747/237
f 533/689/237 532/681/237 596/747/237 597/755/237
f 534/695/237 533/689/237 597/755/237 598/761/237
f 535/701/237 534/695/237 598/761/237 599/767/237
f 536/707/237 535/701/237 599/767/237 600/773/237
f 537/648/237 536/707/237 600/773/237 601/714/237
f 538/649/237 537/648/237 601/714/237 602/713/237
f 539/655/237 538/649/237 602/713/237 603/721/237
f 540/659/237 539/655/237 603/721/237 604/725/237
f 541/663/237 540/659/237 604/725/237 605/729/237
f 542/667/237 541/663/237 605/729/237 606/733/237
f 543/671/237 542/667/237 606/733/237 607/737/237
f 544/675/237 543/671/237 607/737/237 608/741/237
f 545/679/237 544/675/237 608/741/237 609/745/237
f 546/687/237 545/679/237 609/745/237 610/753/237
f 547/693/237 546/687/237 610/753/237 611/759/237
f 548/699/237 547/693/237 611/759/237 612/765/237
f 549/705/237 548/699/237 612/765/237 613/771/237
f 518/684/237 549/705/237 613/771/237 582/750/237
f 620/774/238 619/775/238 651/776/238 652/777/238
f 634/778/239 633/779/239 665/780/239 666/781/239
f 621/782/240 620/783/240 652/784/240 653/785/240
f 635/786/241 634/778/241 666/781/241 667/787/241
f 622/788/242 621/782/242 653/785/242 654/789/242
f 636/790/243 635/786/243 667/787/243 668/791/243
f 623/792/244 622/788/244 654/789/244 655/793/244
f 637/794/245 636/790/245 668/791/245 669/795/245
f 624/796/246 623/792/246 655/793/246 656/797/246
f 638/798/247 637/794/247 669/795/247 670/799/247
f 625/800/248 624/796/248 656/797/248 657/801/248
f 639/802/249 638/798/249 670/799/249 671/803/249
f 626/804/250 625/800/250 657/801/250 658/805/250
f 640/806/251 639/802/251 671/803/251 672/807/251
f 627/808/252 626/804/252 658/805/252 659/809/252
f 641/810/253 640/806/253 672/807/253 673/811/253
f 628/812/254 627/808/254 659/809/254 660/813/254
f 615/814/255 614/815/255 646/816/255 647/817/255
f 642/818/256 641/810/256 673/811/256 674/819/256
f 629/820/257 628/812/257 660/813/257 661/821/257
f 616/822/258 615/814/258 647/817/258 648/823/258
f 643/824/259 642/818/259 674/819/259 675/825/259
f 630/826/260 629/820/260 661/821/260 662/827/260
f 617/828/261 616/822/261 648/823/261 649/829/261
f 644/830/262 643/824/262 675/825/262 676/831/262
f 631/832/263 630/826/263 662/827/263 663/833/263
f 618/834/264 617/828/264 649/829/264 650/835/264
f 645/836/265 644/830/265 676/831/265 677/837/265
f 632/838/266 631/832/266 663/833/266 664/839/266
f 619/775/267 618/834/267 650/835/267 651/776/267
f 614/815/268 645/836/268 677/837/268 646/816/268
f 633/779/269 632/838/269 664/839/269 665/780/269
f 684/840/270 716/841/270 715/842/270 683/843/270
f 698/844/264 730/845/264 729/846/264 697/847/264
f 685/848/245 717/849/245 716/850/245 684/851/245
f 699/852/267 731/853/267 730/845/267 698/844/267
f 686/854/247 718/855/247 717/849/247 685/848/247
f 700/856/271 732/857/271 731/853/271 699/852/271
f 687/858/249 719/859/249 718/855/249 686/854/249
f 701/860/240 733/861/240 732/857/240 700/856/240
f 688/862/251 720/863/251 719/859/251 687/858/251
f 702/864/242 734/865/242 733/861/242 701/860/242
f 689/866/253 721/867/253 720/863/253 688/862/253
f 703/868/244 735/869/244 734/865/244 702/864/244
f 690/870/256 722/871/256 721/867/256 689/866/256
f 704/872/246 736/873/246 735/869/246 703/868/246
f 691/874/259 723/875/259 722/871/259 690/870/259
f 705/876/248 737/877/248 736/873/248 704/872/248
f 692/878/272 724/879/272 723/875/272 691/874/272
f 679/880/263 711/881/263 710/882/263 678/883/263
f 706/884/250 738/885/250 737/877/250 705/876/250
f 693/886/265 725/887/265 724/879/265 692/878/265
f 680/888/266 712/889/266 711/881/266 679/880/266
f 707/890/252 739/891/252 738/885/252 706/884/252
f 694/892/268 726/893/268 725/887/268 693/886/268
f 681/894/269 713/895/269 712/889/269 680/888/269
f 708/896/273 740/897/273 739/891/273 707/890/273
f 695/898/255 727/899/255 726/893/255 694/892/255
f 682/900/239 714/901/239 713/895/239 681/894/239
f 709/902/257 741/903/257 740/897/257 708/896/257
f 696/904/258 728/905/258 727/899/258 695/898/258
f 683/843/241 715/842/241 714/901/241 682/900/241
f 678/883/260 710/882/260 741/903/260 709/902/260
f 697/847/261 729/846/261 728/905/261 696/904/261
f 614/815/274 615/814/274 679/880/274 678/883/274
f 615/814/274 616/822/274 680/888/274 679/880/274
f 616/822/274 617/828/274 681/894/274 680/888/274
f 617/828/274 618/834/274 682/900/274 681/894/274
f 618/834/274 619/775/274 683/843/274 682/900/274
f 619/775/274 620/774/274 684/840/274 683/843/274
f 620/783/274 621/782/274 685/848/274 684/851/274
f 621/782/274 622/788/274 686/854/274 685/848/274
f 622/788/274 623/792/274 687/858/274 686/854/274
f 623/792/274 624/796/274 688/862/274 687/858/274
f 624/796/274 625/800/274 689/866/274 688/862/274
f 625/800/274 626/804/274 690/870/274 689/866/274
f 626/804/274 627/808/274 691/874/274 690/870/274
f 627/808/274 628/812/274 692/878/274 691/874/274
f 628/812/274 629/820/274 693/886/274 692/878/274
f 629/820/274 630/826/274 694/892/274 693/886/274
f 630/826/274 631/832/274 695/898/274 694/892/274
f 631/832/274 632/838/274 696/904/274 695/898/274
f 632/838/274 633/779/274 697/847/274 696/904/274
f 633/779/274 634/778/274 698/844/274 697/847/274
f 634/778/274 635/786/274 699/852/274 698/844/274
f 635/786/274 636/790/274 700/856/274 699/852/274
f 636/790/274 637/794/274 701/860/274 700/856/274
f 637/794/274 638/798/274 702/864/274 701/860/274
f 638/798/274 639/802/274 703/868/274 702/864/274
f 639/802/274 640/806/274 704/872/274 703/868/274
f 640/806/274 641/810/274 705/876/274 704/872/274
f 641/810/274 642/818/274 706/884/274 705/876/274
f 642/818/274 643/824/274 707/890/274 706/884/274
f 643/824/274 644/830/274 708/896/274 707/890/274
f 644/830/274 645/836/274 709/902/274 708/896/274
f 645/836/274 614/815/274 678/883/274 709/902/274
f 647/817/275 646/816/275 710/882/275 711/881/275
f 648/823/275 647/817/275 711/881/275 712/889/275
f 649/829/275 648/823/275 712/889/275 713/895/275
f 650/835/275 649/829/275 713/895/275 714/901/275
f 651/776/275 650/835/275 714/901/275 715/842/275
f 652/777/275 651/776/275 715/842/275 716/841/275
f 653/785/275 652/784/275 716/850/275 717/849/275
f 654/789/275 653/785/275 717/849/275 718/855/275
f 655/793/275 654/789/275 718/855/275 719/859/275
f 656/797/275 655/793/275 719/859/275 720/863/275
f 657/801/275 656/797/275 720/863/275 721/867/275
f 658/805/275 657/801/275 721/867/275 722/871/275
f 659/809/275 658/805/275 722/871/275 723/875/275
f 660/813/275 659/809/275 723/875/275 724/879/275
f 661/821/275 660/813/275 724/879/275 725/887/275
f 662/827/275 661/821/275 725/887/275 726/893/275
f 663/833/275 662/827/275 726/893/275 727/899/275
f 664/839/275 663/833/275 727/899/275 728/905/275
f 665/780/275 664/839/275 728/905/275 729/846/275
f 666/781/275 665/780/275 729/846/275 730/845/275
f 667/787/275 666/781/275 730/845/275 731/853/275
f 668/791/275 667/787/275 731/853/275 732/857/275
f 669/795/275 668/791/275 732/857/275 733/861/275
f 670/799/275 669/795/275 733/861/275 734/865/275
f 671/803/275 670/799/275 734/865/275 735/869/275
f 672/807/275 671/803/275 735/869/275 736/873/275
f 673/811/275 672/807/275 736/873/275 737/877/275
f 674/819/275 673/811/275 737/877/275 738/885/275
f 675/825/275 674/819/275 738/885/275 739/891/275
f 676/831/275 675/825/275 739/891/275 740/897/275
f 677/837/275 676/831/275 740/897/275 741/903/275
f 646/816/275 677/837/275 741/903/275 710/882/275
f 748/906/276 747/907/276 779/908/276 780/909/276
f 762/910/277 761/911/277 793/912/277 794/913/277
f 749/914/278 748/915/278 780/916/278 781/917/278
f 763/918/279 762/910/279 794/913/279 795/919/279
f 750/920/280 749/914/280 781/917/280 782/921/280
f 764/922/281 763/918/281 795/919/281 796/923/281
f 751/924/282 750/920/282 782/921/282 783/925/282
f 765/926/283 764/922/283 796/923/283 797/927/283
f 752/928/284 751/924/284 783/925/284 784/929/284
f 766/930/285 765/926/285 797/927/285 798/931/285
f 753/932/286 752/928/286 784/929/286 785/933/286
f 767/934/287 766/930/287 798/931/287 799/935/287
f 754/936/288 753/932/288 785/933/288 786/937/288
f 768/938/289 767/934/289 799/935/289 800/939/289
f 755/940/290 754/936/290 786/937/290 787/941/290
f 769/942/291 768/938/291 800/939/291 801/943/291
f 756/944/292 755/940/292 787/941/292 788/945/292
f 743/946/293 742/947/293 774/948/293 775/949/293
f 770/950/294 769/942/294 801/943/294 802/951/294
f 757/952/295 756/944/295 788/945/295 789/953/295
f 744/954/296 743/946/296 775/949/296 776/955/296
f 771/956/297 770/950/297 802/951/297 803/957/297
f 758/958/298 757/952/298 789/953/298 790/959/298
f 745/960/299 744/954/299 776/955/299 777/961/299
f 772/962/300 771/956/300 803/957/300 804/963/300
f 759/964/301 758/958/301 790/959/301 791/965/301
f 746/966/302 745/960/302 777/961/302 778/967/302
f 773/968/303 772/962/303 804/963/303 805/969/303
f 760/970/304 759/964/304 791/965/304 792/971/304
f 747/907/305 746/966/305 778/967/305 779/908/305
f 742/947/306 773/968/306 805/969/306 774/948/306
f 761/911/307 760/970/307 792/971/307 793/912/307
f 812/972/281 844/973/281 843/974/281 811/975/281
f 826/976/302 858/977/302 857/978/302 825/979/302
f 813/980/283 845/981/283 844/982/283 812/983/283
f 827/984/305 859/985/305 858/977/305 826/976/305
f 814/986/285 846/987/285 845/981/285 813/980/285
f 828/988/276 860/989/276 859/985/276 827/984/276
f 815/990/287 847/991/287 846/987/287 814/986/287
f 829/992/278 861/993/278 860/989/278 828/988/278
f 816/994/289 848/995/289 847/991/289 815/990/289
f 830/996/280 862/997/280 861/993/280 829/992/280
f 817/998/291 849/999/291 848/995/291 816/994/291
f 831/1000/282 863/1001/282 862/997/282 830/996/282
f 818/1002/294 850/1003/294 849/999/294 817/998/294
f 832/1004/284 864/1005/284 863/1001/284 831/1000/284
f 819/1006/297 851/1007/297 850/1003/297 818/1002/297
f 833/1008/286 865/1009/286 864/1005/286 832/1004/286
f 820/1010/300 852/1011/300 851/1007/300 819/1006/300
f 807/1012/301 839/1013/301 838/1014/301 806/1015/301
f 834/1016/288 866/1017/288 865/1009/288 833/1008/288
f 821/1018/303 853/1019/303 852/1011/303 820/1010/303
f 808/1020/304 840/1021/304 839/1013/304 807/1012/304
f 835/1022/290 867/1023/290 866/1017/290 834/1016/290
f 822/1024/306 854/1025/306 853/1019/306 821/1018/306
f 809/1026/307 841/1027/307 840/1021/307 808/1020/307
f 836/1028/292 868/1029/292 867/1023/292 835/1022/292
f 823/1030/293 855/1031/293 854/1025/293 822/1024/293
f 810/1032/277 842/1033/277 841/1027/277 809/1026/277
f 837/1034/295 869/1035/295 868/1029/295 836/1028/295
f 824/1036/296 856/1037/296 855/1031/296 823/1030/296
f 811/975/279 843/974/279 842/1033/279 810/1032/279
f 806/1015/298 838/1014/298 869/1035/298 837/1034/298
f 825/979/299 857/978/299 856/1037/299 824/1036/299
f 742/947/308 743/946/308 807/1012/308 806/1015/308
f 743/946/308 744/954/308 808/1020/308 807/1012/308
f 744/954/308 745/960/308 809/1026/308 808/1020/308
f 745/960/308 746/966/308 810/1032/308 809/1026/308
f 746/966/308 747/907/308 811/975/308 810/1032/308
f 747/907/308 748/906/308 812/972/308 811/975/308
f 748/915/308 749/914/308 813/980/308 812/983/308
f 749/914/308 750/920/308 814/986/308 813/980/308
f 750/920/308 751/924/308 815/990/308 814/986/308
f 751/924/308 752/928/308 816/994/308 815/990/308
f 752/928/308 753/932/308 817/998/308 816/994/308
f 753/932/308 754/936/308 818/1002/308 817/998/308
f 754/936/308 755/940/308 819/1006/308 818/1002/308
f 755/940/308 756/944/308 820/1010/308 819/1006/308
f 756/944/308 757/952/308 821/1018/308 820/1010/308
f 757/952/308 758/958/308 822/1024/308 821/1018/308
f 758/958/308 759/964/308 823/1030/308 822/1024/308
f 759/964/308 760/970/308 824/1036/308 823/1030/308
f 760/970/308 761/911/308 825/979/308 824/1036/308
f 761/911/308 762/910/308 826/976/308 825/979/308
f 762/910/308 763/918/308 827/984/308 826/976/308
f 763/918/308 764/922/308 828/988/308 827/984/308
f 764/922/308 765/926/308 829/992/308 828/988/308
f 765/926/308 766/930/308 830/996/308 829/992/308
f 766/930/308 767/934/308 831/1000/308 830/996/308
f 767/934/308 768/938/308 832/1004/308 831/1000/308
f 768/938/308 769/942/308 833/1008/308 832/1004/308
f 769/942/308 770/950/308 834/1016/308 833/1008/308
f 770/950/308 771/956/308 835/1022/308 834/1016/308
f 771/956/308 772/962/308 836/1028/308 835/1022/308
f 772/962/308 773/968/308 837/1034/308 836/1028/308
f 773/968/308 742/947/308 806/1015/308 837/1034/308
f 775/949/309 774/948/309 838/1014/309 839/1013/309
f 776/955/309 775/949/309 839/1013/309 840/1021/309
f 777/961/309 776/955/309 840/1021/309 841/1027/309
f 778/967/309 777/961/309 841/1027/309 842/1033/309
f 779/908/309 778/967/309 842/1033/309 843/974/309
f 780/909/309 779/908/309 843/974/309 844/973/309
f 781/917/309 780/916/309 844/982/309 845/981/309
f 782/921/309 781/917/309 845/981/309 846/987/309
f 783/925/309 782/921/309 846/987/309 847/991/309
f 784/929/309 783/925/309 847/991/309 848/995/309
f 785/933/309 784/929/309 848/995/309 849/999/309
f 786/937/309 785/933/309 849/999/309 850/1003/309
f 787/941/309 786/937/309 850/1003/309 851/1007/309
f 788/945/309 787/941/309 851/1007/309 852/1011/309
f 789/953/309 788/945/309 852/1011/309 853/1019/309
f 790/959/309 789/953/309 853/1019/309 854/1025/309
f 791/965/309 790/959/309 854/1025/309 855/1031/309
f 792/971/309 791/965/309 855/1031/309 856/1037/309
f 793/912/309 792/971/309 856/1037/309 857/978/309
f 794/913/309 793/912/309 857/978/309 858/977/309
f 795/919/309 794/913/309 858/977/309 859/985/309
f 796/923/309 795/919/309 859/985/309 860/989/309
f 797/927/309 796/923/309 860/989/309 861/993/309
f 798/931/309 797/927/309 861/993/309 862/997/309
f 799/935/309 798/931/309 862/997/309 863/1001/309
f 800/939/309 799/935/309 863/1001/309 864/1005/309
f 801/943/309 800/939/309 864/1005/309 865/1009/309
f 802/951/309 801/943/309 865/1009/309 866/1017/309
f 803/957/309 802/951/309 866/1017/309 867/1023/309
f 804/963/309 803/957/309 867/1023/309 868/1029/309
f 805/969/309 804/963/309 868/1029/309 869/1035/309
f 774/948/309 805/969/309 869/1035/309 838/1014/309
o wood
v -0.354512 -0.038922 -0.198873
v -0.386499 -0.038922 -0.125890
v -0.362313 -0.038922 0.184278
v -0.319401 -0.038922 0.251421
v 0.354512 -0.038922 0.198873
v 0.386498 -0.038922 0.125889
v 0.362313 -0.038922 -0.184279
v 0.319400 -0.038922 -0.251422
v -0.406839 -0.038922 -0.228228
v -0.443547 -0.038922 -0.144472
v -0.415792 -0.038922 0.211478
v -0.366545 -0.038922 0.288532
v 0.406839 -0.038922 0.228227
v 0.443547 -0.038922 0.144471
v 0.415792 -0.038922 -0.211479
v 0.366545 -0.038922 -0.288532
v -0.386499 -0.500000 -0.125890
v -0.354512 -0.500000 -0.198873
v -0.319401 -0.500000 0.251421
v -0.362313 -0.500000 0.184278
v 0.386498 -0.500000 0.125889
v 0.354512 -0.500000 0.198873
v 0.319400 -0.500000 -0.251422
v 0.362313 -0.500000 -0.184279
v -0.443547 -0.500000 -0.144472
v -0.406839 -0.500000 -0.228228
v -0.366545 -0.500000 0.288532
v -0.415792 -0.500000 0.211478
v 0.443547 -0.500000 0.144471
v 0.406839 -0.500000 0.228227
v 0.366545 -0.500000 -0.288532
v 0.415792 -0.500000 -0.211479
vt 1.388065 0.664137
vt 1.486764 0.664137
vt 0.030939 0.664137
vt 1.519146 0.664137
vt -0.486764 0.664137
vt -0.388064 0.664137
vt -0.180972 0.664137
vt -0.632414 0.664137
vt 1.486764 0.664137
vt 1.388064 0.664137
vt 1.180972 0.664137
vt 1.632414 0.664137
vt -0.388064 0.664137
vt -0.486764 0.664137
vt 0.969060 0.664137
vt -0.519145 0.664137
vt 1.632414 -0.547378
vt 1.486764 -0.547378
vt -0.519145 0.664137
vt -0.388064 -0.547378
vt -0.519145 -0.547378
vt -0.093386 0.664137
vt 0.091269 0.664137
vt 0.091269 -0.547378
vt -0.093386 -0.547378
vt 0.030939 0.664137
vt -0.180972 -0.547378
vt 0.030939 -0.547378
vt -0.486764 1.062816
vt -0.388064 1.247470
vt -0.519145 1.335056
vt -0.632414 1.123146
vt -0.388064 0.060699
vt -0.486764 0.245354
vt -0.632414 0.185024
vt -0.519145 -0.026887
vt 1.486764 0.245354
vt 1.388065 0.060700
vt 1.519146 -0.026887
vt 1.632414 0.185025
vt 1.388064 1.247471
vt 1.486764 1.062817
vt 1.632414 1.123147
vt 1.519145 1.335057
vt 0.969061 0.664137
vt 1.180972 -0.547378
vt 0.969061 -0.547378
vt 1.093386 0.664137
vt 0.908732 0.664137
vt 0.908732 -0.547378
vt 1.093386 -0.547378
vt 1.519145 0.664137
vt 1.388064 -0.547378
vt 1.519145 -0.547378
vt -0.519145 -0.547378
vt -0.388064 -0.547378
vt 1.180971 0.664137
vt 0.969060 -0.547378
vt 1.180971 -0.547378
vt 0.908731 0.664137
vt 1.093385 0.664137
vt 1.093385 -0.547378
vt 0.908731 -0.547378
vt -0.632414 0.664137
vt -0.486764 -0.547378
vt -0.632414 -0.547378
vt 1.519146 -0.547378
vt 1.388065 -0.547378
vt -0.180972 0.664137
vt 0.030939 -0.547378
vt -0.180972 -0.547378
vt 0.091269 0.664137
vt -0.093385 0.664137
vt -0.093385 -0.547378
vt 0.091269 -0.547378
vt 1.632414 0.664137
vt 1.486764 -0.547378
vt 1.632414 -0.547378
vt -0.632414 -0.547378
vt -0.486764 -0.547378
vn 0.0000 -1.0000 -0.0000
vn -0.4533 0.0000 -0.8913
vn -0.6185 0.0000 -0.7858
vn -0.8426 0.0000 0.5385
vn 0.8426 0.0000 -0.5385
vn 0.0000 1.0000 0.0000
vn 0.6185 0.0000 0.7858
vn -0.4893 0.0000 0.8721
vn 0.9159 0.0000 0.4014
vn -0.9159 0.0000 -0.4014
vn 0.3097 -0.0000 -0.9508
vn 0.4893 -0.0000 -0.8721
vn -0.3097 0.0000 0.9508
vn 0.4533 0.0000 0.8913
g wood_wood_wood
usemtl wood
s off
f 874/1038/310 875/1039/310 883/1040/310 882/1041/310
f 872/1042/310 873/1043/310 881/1044/310 880/1045/310
f 876/1046/310 877/1047/310 885/1048/310 884/1049/310
f 870/1050/310 871/1051/310 879/1052/310 878/1053/310
f 876/1046/311 884/1049/311 901/1054/311 893/1055/311
f 881/1056/312 873/1043/312 888/1057/312 896/1058/312
f 873/1059/313 872/1060/313 889/1061/313 888/1062/313
f 880/1063/314 881/1044/314 896/1064/314 897/1065/314
f 886/1066/315 887/1067/315 895/1068/315 894/1069/315
f 888/1070/315 889/1071/315 897/1072/315 896/1073/315
f 890/1074/315 891/1075/315 899/1076/315 898/1077/315
f 892/1078/315 893/1079/315 901/1080/315 900/1081/315
f 884/1082/313 885/1048/313 900/1083/313 901/1084/313
f 877/1085/314 876/1086/314 893/1087/314 892/1088/314
f 885/1089/316 877/1047/316 892/1090/316 900/1091/316
f 870/1050/317 878/1053/317 895/1092/317 887/1093/317
f 878/1094/318 879/1052/318 894/1095/318 895/1096/318
f 871/1097/319 870/1098/319 887/1099/319 886/1100/319
f 879/1101/320 871/1051/320 886/1102/320 894/1103/320
f 874/1038/321 882/1041/321 899/1104/321 891/1105/321
f 882/1106/319 883/1040/319 898/1107/319 899/1108/319
f 875/1109/318 874/1110/318 891/1111/318 890/1112/318
f 883/1113/322 875/1039/322 890/1114/322 898/1115/322
f 872/1042/323 880/1045/323 897/1116/323 889/1117/323

Modified potions.lua from [6c72918b5d] to [ed6c69759e].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
..
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
..
84
85
86
87
88
89
90
91
92
93

94
95
96
97
98
99
100
...
101
102
103
104
105
106
107

108
109

110
111
112
113
114
115
116
117
...
141
142
143
144
145
146
147
148
149
150

151
152
153
154
155
156
157
158
159
160
161
162
163
164

165
166
167
168
169
170
171
172
173
174

175
176
177
178
179
180
181
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198

199
200
201
202
203
204
205
206
207
208
209
210
211
...
220
221
222
223
224
225
226
227
local u = sorcery.lib
sorcery.data.infusions = {} -- not sure where to put this tbh
sorcery.data.infusion_leftovers = {}

sorcery.register_potion = function(name,label,desc,color,imgvariant,glow,extra)
	local image = 'sorcery_liquid_'..(imgvariant or 'dull')..'.png' .. 
		'^[multiply:'..tostring(color)..
		'^vessels_glass_bottle.png'

	sorcery.data.register.infusion_leftover('sorcery:' .. name, 'vessels:glass_bottle')
	local node = {
		description = color:darken(0.8):bg(
			sorcery.lib.ui.tooltip {
				title = label;
				desc = desc;
				color = color:readable();
			}
................................................................................
	node.groups.vessel = 1;
	node.groups.not_in_creative_inventory = 1;
	minetest.register_node("sorcery:"..name, node)
end

sorcery.register_oil = function(name,label,desc,color,imgvariant,extra)
	local image = 'xdecor_bowl.png^(sorcery_oil_' .. (imgvariant or 'dull') .. '.png^[colorize:'..tostring(color)..':140)'
	sorcery.data.register.infusion_leftover('sorcery:' .. name, 'xdecor:bowl')
	extra.description = label;
	extra.inventory_image = image;
	if not extra.groups then extra.groups = {} end
	minetest.register_craftitem('sorcery:' .. name, extra)
end

sorcery.register_potion('blood', 'Blood', 'A bottle of sacrificial blood, imbued\nwith stolen life force', u.color(219,19,14))
sorcery.register_potion('potion_water', 'Water Bottle', 'A bottle of plain water', u.color(43,90,162))
sorcery.register_potion('holy_water', 'Holy Water','A bottle of consecrated water',u.color(94,138,206),'sparkle',6)

local create_infusion_recipe = function(id,potion,default_basis,proto)
	if potion.infusion then
		sorcery.data.register.infusion {
			infuse = potion.infusion;
			into = potion.basis or default_basis;
			output = 'sorcery:' .. id;
			_proto = proto;
		}
	end
end

for n,v in pairs(sorcery.data.potions) do

	local color = u.color(v.color)
	local kind = v.style
	local glow = v.glow
	local id = 'potion_' .. string.lower(n)
	local desc = 'A ' .. ((glow and 'glowing ') or '') ..
		'bottle of ' .. string.lower(n) .. 
		((kind == 'sparkle' and ', fiercely bubbling') or '') ..
................................................................................
		_proto = v;
		groups = {
			sorcery_potion = 1;
			sorcery_magical = 1;
		};
	})
	create_infusion_recipe(id,v,'sorcery:potion_serene',{data=v,name=fullname})
end

for n,potion in pairs(sorcery.data.draughts) do

	local name = 'draught_' .. n
	local behavior = {
		_proto = potion;
		groups = {
			sorcery_potion = 2;
			sorcery_draught = 1;
			sorcery_magical = 1;
................................................................................
			sorcery_usable_magic = 1;
		};
		on_use = function(stack, user, pointat)
			local pproto = stack:get_definition()._proto
			if potion.effect(stack, user, pproto) == false then return nil end
			local meta = stack:get_meta()
			local force = meta:get_int('force');

			minetest.add_particlespawner {
				amount = 200 + (30 * force);

				time = pproto:duration(meta);
				minpos = { x = -0.1; y = 0; z = -0.1; };
				maxpos = { x = 0.1; y = 2; z = 0.1; };
				minvel = { x = -0.1; y = 0; z = -0.1; };
				maxvel = { x = 0.1; y = 0; z = 0.1; };
				minacc = { x = 0; y = 0.1; z = 0; };
				maxacc = { x = 0; y = 1; z = 0; };
				minexptime = 1;
................................................................................
	sorcery.register_potion(name, fullname,
		potion.desc,
		u.color(potion.color),
		potion.style or 'dull',
		potion.glow or 0,
		behavior)
	create_infusion_recipe(name,potion,'sorcery:potion_luminous',{data=potion,name=fullname})
end

for n,elixir in pairs(sorcery.data.elixirs) do

	local color = u.color(elixir.color)
	local id = 'elixir_' .. string.lower(n)
	local fullname = 'Elixir of ' .. n
	sorcery.register_potion(id, fullname, nil, color, 'dull', false, {
		_proto = elixir;
		groups = {
			sorcery_elixir = 1;
			sorcery_magical = 1;
		};
	})
	create_infusion_recipe(id,elixir,'sorcery:potion_misty',{data=elixir,name=fullname})
end

for n,v in pairs(sorcery.data.oils) do

	local color = u.color(v.color)
	local kind = v.style
	local id = 'oil_' .. n
	n = v.name or u.str.capitalize(n)
	sorcery.register_oil(id, n .. ' Oil', nil, color, kind, {
		groups = { sorcery_oil = 1 };
	})
end

for n,v in pairs(sorcery.data.greases) do

	local color = u.color(v.color)
	local kind = v.style
	sorcery.register_oil('grease_' .. n, u.str.capitalize(n) .. ' Grease', nil, color, kind, {
		groups = { sorcery_grease = 1 }
	})
end

for n,v in pairs(sorcery.data.philters) do

	local color = u.color(v.color)
	local id = 'philter_' .. n
	local name = v.name or u.str.capitalize(n)
	local fullname = name .. ' Philter'
	sorcery.register_potion(id, fullname, v.desc, color, 'sparkle',v.glow or 4, {
		_proto = v;
		_protoname = n;
		groups = {
			sorcery_magical = 1;
			sorcery_philter = 1;
		};
	})
	create_infusion_recipe(id,v,'sorcery:potion_viscous',{data=v,name=fullname})
end

for n,v in pairs(sorcery.data.extracts) do

	local item = v[1]
	local color = u.color(v[2])
	local name = 'extract_' .. n
	sorcery.register_potion(name, u.str.capitalize(n) .. ' Extract', nil, color, 'sparkle', false, {
		groups = {
			sorcery_extracts = 1;
		};
	})

	local add_alcohol = function(booze)
		minetest.register_craft {
			type = "shapeless";
			recipe = {
................................................................................
			};
		}
	end
	-- need a relatively pure alcohol for this, tho other alcohols can be used
	-- for potionmaking in other ways
	add_alcohol('farming:bottle_ethanol')
	add_alcohol('wine:glass_vodka')
end

|
|






|







 







|












|








|
>







 







|

|
>







 







>

<
>
|







 







|

|
>











|

|
>







|

|
>





|

|
>













|

|
>





|







 







|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
..
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
..
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
...
103
104
105
106
107
108
109
110
111

112
113
114
115
116
117
118
119
120
...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
...
228
229
230
231
232
233
234
235
local u = sorcery.lib
sorcery.registry.mk('infusions',false)
sorcery.registry.mk('residue',false)

sorcery.register_potion = function(name,label,desc,color,imgvariant,glow,extra)
	local image = 'sorcery_liquid_'..(imgvariant or 'dull')..'.png' .. 
		'^[multiply:'..tostring(color)..
		'^vessels_glass_bottle.png'

	sorcery.register.residue.link('sorcery:' .. name, 'vessels:glass_bottle')
	local node = {
		description = color:darken(0.8):bg(
			sorcery.lib.ui.tooltip {
				title = label;
				desc = desc;
				color = color:readable();
			}
................................................................................
	node.groups.vessel = 1;
	node.groups.not_in_creative_inventory = 1;
	minetest.register_node("sorcery:"..name, node)
end

sorcery.register_oil = function(name,label,desc,color,imgvariant,extra)
	local image = 'xdecor_bowl.png^(sorcery_oil_' .. (imgvariant or 'dull') .. '.png^[colorize:'..tostring(color)..':140)'
	sorcery.register.residue.link('sorcery:' .. name, 'xdecor:bowl')
	extra.description = label;
	extra.inventory_image = image;
	if not extra.groups then extra.groups = {} end
	minetest.register_craftitem('sorcery:' .. name, extra)
end

sorcery.register_potion('blood', 'Blood', 'A bottle of sacrificial blood, imbued\nwith stolen life force', u.color(219,19,14))
sorcery.register_potion('potion_water', 'Water Bottle', 'A bottle of plain water', u.color(43,90,162))
sorcery.register_potion('holy_water', 'Holy Water','A bottle of consecrated water',u.color(94,138,206),'sparkle',6)

local create_infusion_recipe = function(id,potion,default_basis,proto)
	if potion.infusion then
		sorcery.register.infusions.link {
			infuse = potion.infusion;
			into = potion.basis or default_basis;
			output = 'sorcery:' .. id;
			_proto = proto;
		}
	end
end

-- for n,v in pairs(sorcery.data.potions) do
sorcery.register.potions.foreach('sorcery:mknodes',{},function(n,v)
	local color = u.color(v.color)
	local kind = v.style
	local glow = v.glow
	local id = 'potion_' .. string.lower(n)
	local desc = 'A ' .. ((glow and 'glowing ') or '') ..
		'bottle of ' .. string.lower(n) .. 
		((kind == 'sparkle' and ', fiercely bubbling') or '') ..
................................................................................
		_proto = v;
		groups = {
			sorcery_potion = 1;
			sorcery_magical = 1;
		};
	})
	create_infusion_recipe(id,v,'sorcery:potion_serene',{data=v,name=fullname})
end)

-- for n,potion in pairs(sorcery.data.draughts) do
sorcery.register.draughts.foreach('sorcery:mknodes',{},function(n,potion)
	local name = 'draught_' .. n
	local behavior = {
		_proto = potion;
		groups = {
			sorcery_potion = 2;
			sorcery_draught = 1;
			sorcery_magical = 1;
................................................................................
			sorcery_usable_magic = 1;
		};
		on_use = function(stack, user, pointat)
			local pproto = stack:get_definition()._proto
			if potion.effect(stack, user, pproto) == false then return nil end
			local meta = stack:get_meta()
			local force = meta:get_int('force');
			local duration = pproto:duration(meta);
			minetest.add_particlespawner {

				amount = (7 + (10 * force)) * duration;
				time = duration;
				minpos = { x = -0.1; y = 0; z = -0.1; };
				maxpos = { x = 0.1; y = 2; z = 0.1; };
				minvel = { x = -0.1; y = 0; z = -0.1; };
				maxvel = { x = 0.1; y = 0; z = 0.1; };
				minacc = { x = 0; y = 0.1; z = 0; };
				maxacc = { x = 0; y = 1; z = 0; };
				minexptime = 1;
................................................................................
	sorcery.register_potion(name, fullname,
		potion.desc,
		u.color(potion.color),
		potion.style or 'dull',
		potion.glow or 0,
		behavior)
	create_infusion_recipe(name,potion,'sorcery:potion_luminous',{data=potion,name=fullname})
end)

-- for n,elixir in pairs(sorcery.data.elixirs) do
sorcery.register.elixirs.foreach('sorcery:mknodes',{},function(n,elixir)
	local color = u.color(elixir.color)
	local id = 'elixir_' .. string.lower(n)
	local fullname = 'Elixir of ' .. n
	sorcery.register_potion(id, fullname, nil, color, 'dull', false, {
		_proto = elixir;
		groups = {
			sorcery_elixir = 1;
			sorcery_magical = 1;
		};
	})
	create_infusion_recipe(id,elixir,'sorcery:potion_misty',{data=elixir,name=fullname})
end)

-- for n,v in pairs(sorcery.data.oils) do
sorcery.register.oils.foreach('sorcery:mknodes',{},function(n,v)
	local color = u.color(v.color)
	local kind = v.style
	local id = 'oil_' .. n
	n = v.name or u.str.capitalize(n)
	sorcery.register_oil(id, n .. ' Oil', nil, color, kind, {
		groups = { sorcery_oil = 1 };
	})
end)

-- for n,v in pairs(sorcery.data.greases) do
sorcery.register.greases.foreach('sorcery:mknodes',{},function(n,v)
	local color = u.color(v.color)
	local kind = v.style
	sorcery.register_oil('grease_' .. n, u.str.capitalize(n) .. ' Grease', nil, color, kind, {
		groups = { sorcery_grease = 1 }
	})
end)

-- for n,v in pairs(sorcery.data.philters) do
sorcery.register.philters.foreach('sorcery:mknodes',{},function(n,v)
	local color = u.color(v.color)
	local id = 'philter_' .. n
	local name = v.name or u.str.capitalize(n)
	local fullname = name .. ' Philter'
	sorcery.register_potion(id, fullname, v.desc, color, 'sparkle',v.glow or 4, {
		_proto = v;
		_protoname = n;
		groups = {
			sorcery_magical = 1;
			sorcery_philter = 1;
		};
	})
	create_infusion_recipe(id,v,'sorcery:potion_viscous',{data=v,name=fullname})
end)

-- for n,v in pairs(sorcery.data.extracts) do
sorcery.register.extracts.foreach('sorcery:mknodes',{},function(n,v)
	local item = v[1]
	local color = u.color(v[2])
	local name = 'extract_' .. n
	sorcery.register_potion(name, u.str.capitalize(n) .. ' Extract', nil, color, 'sparkle', false, {
		groups = {
			sorcery_extract = 1;
		};
	})

	local add_alcohol = function(booze)
		minetest.register_craft {
			type = "shapeless";
			recipe = {
................................................................................
			};
		}
	end
	-- need a relatively pure alcohol for this, tho other alcohols can be used
	-- for potionmaking in other ways
	add_alcohol('farming:bottle_ethanol')
	add_alcohol('wine:glass_vodka')
end)

Added precipitator.lua version [74e73185fe].







>
>
>
1
2
3
-- the precipitator is a ley device that takes fluids as input
-- and produces solid outputs in the form of powder. for instance,
-- water can be poured in to precipitate out magnesium(?)

Modified recipes.lua from [b5f23ba87a] to [41529558e5].

648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
		{'group:wood','default:stick','group:wood'};
	};
	replacements = {
		{'screwdriver:screwdriver','screwdriver:screwdriver'};
	};
};

sorcery.data.register.infusion_leftover('sorcery:ink','vessels:glass_bottle')
sorcery.data.register.infusion_leftover('sorcery:erasure_fluid','vessels:glass_bottle')

---- altar
minetest.register_craftitem('sorcery:candle', {
	-- TODO make candle node
	inventory_image = 'sorcery_candle.png';
	description = 'Votive Candle';
	groups = {
................................................................................
		recipe = sorcery.lib.tbl.append(recipe, substance.core)
	elseif container then
		recipe[#recipe + 1] = container
	end
	if substance.mix and #substance.mix > 0 then
		recipe = sorcery.lib.tbl.append(recipe, substance.mix)
		for _,r in pairs(substance.mix) do
			if sorcery.data.infusion_leftovers[r] then
				replace[#replace + 1] = {
					r, sorcery.data.infusion_leftovers[r]
				}
			end
		end
	end

	minetest.register_craft {
		type = 'shapeless';







|
|







 







|

|







648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
		{'group:wood','default:stick','group:wood'};
	};
	replacements = {
		{'screwdriver:screwdriver','screwdriver:screwdriver'};
	};
};

sorcery.register.residue.link('sorcery:ink','vessels:glass_bottle')
sorcery.register.residue.link('sorcery:erasure_fluid','vessels:glass_bottle')

---- altar
minetest.register_craftitem('sorcery:candle', {
	-- TODO make candle node
	inventory_image = 'sorcery_candle.png';
	description = 'Votive Candle';
	groups = {
................................................................................
		recipe = sorcery.lib.tbl.append(recipe, substance.core)
	elseif container then
		recipe[#recipe + 1] = container
	end
	if substance.mix and #substance.mix > 0 then
		recipe = sorcery.lib.tbl.append(recipe, substance.mix)
		for _,r in pairs(substance.mix) do
			if sorcery.register.residue.db[r] then
				replace[#replace + 1] = {
					r, sorcery.register.residue.db[r]
				}
			end
		end
	end

	minetest.register_craft {
		type = 'shapeless';

Added registration.lua version [d98f045dad].









































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
if not sorcery then sorcery = {DEBUG=true} end
sorcery.register = {}
sorcery.registry = {
	defercheck = function() return true end
	-- used to warn about deferments that have not been discharged by a certain threshold
}
sorcery.registry.mk = function(name,db)
	local reg = {}
	if db == nil then
		-- predefined db
		db = sorcery.data[name]
	elseif db == false then -- auxiliary db, stored in registry itself
		reg.db = {}
		db = reg.db
	end
	local dat = {
		iters = {};
		state = {};
		defer = {};
	}
	reg.invoke = function(fnid,tgtid)
		local fno = dat.iters[fnid]
		if not fno then return false end

		local runid = fnid .. '@' ..tgtid
		if dat.state[runid] then return true end

		if fno.deps then for k,f in pairs(fno.deps) do
			if reg.invoke(f,tgtid) == false then return false end
		end end
		
		fno.fn(tgtid, db[tgtid])

		dat.state[runid] = true
		return true
	end
	reg.foreach = function(ident,deps,fn)
		dat.iters[ident] = {deps = deps, fn = fn}
		for k in pairs(db) do
			if reg.invoke(ident,k) == false then
				-- not all dependencies are available
				-- to run yet; must defer until then
				dat.defer[#dat.defer+1] = ident
				return false
			end
		end
		for i,dfn in pairs(dat.defer) do
			local deferred = dat.iters[dfn]
			for _,d in pairs(deferred.deps) do
				if not dat.iters[d] then goto skipdfmt end
			end
			-- a deferred function can now be run, do so
			table.remove(dat.defer,i)
			reg.foreach(dfn,deferred.deps,deferred.fn)
		::skipdfmt::end

		return true
	end
	reg.link = function(key,value)
		-- support simple arrays as well as kv stores
		if value == nil then
			value = key
			key = #db+1
		end
		db[key] = value
		for id in pairs(dat.iters) do 
			reg.invoke(id,key)
		end
	end
	reg.meld = function(tbl)
		for k,v in pairs(tbl) do reg.add(k,v) end
	end
	sorcery.register[name] = reg

	local nextfn = sorcery.registry.defercheck
	sorcery.registry.defercheck = function()
		if #dat.defer ~= 0 then
			print('WARNING: ' .. tostring(#dat.defer) .. ' deferred iterator(s) have not yet been discharged for registry “' .. name .. '”')
			local log = sorcery.log and function(text)
				sorcery.log('registry',text)
			end or print
			for i,v in pairs(dat.defer) do
				log('\t' .. tostring(i) .. ') ' .. v)
			end
			log('there is likely a missing dependency or dependency ordering problem. also make sure you have spelled the names of the iterator dependencies correctly')
			return false
		end
		nextfn()
	end
	return reg
end

if sorcery.DEBUG then
	local function dump(tbl,indent)
		indent = indent or 0
		local space = string.rep(' ',indent*4)
		for k,v in pairs(tbl) do
			if type(v) == 'table' then
				print(string.format('%s%s = {',space,k))
				dump(v,indent + 1)
				print(string.format('%s}', space))
			else
				print(string.format('%s%s = %q',space,k,tostring(v)))
			end
		end
	end 

	local metals = {
		oregonium = {desc = 'Oregonium'};
		nevadite = {desc = 'Nevadite'};
	}
	local myreg = sorcery.registry.mk('metals',metals)

	sorcery.register.metals.link('californium', {
		desc = "Californium";
	})

	sorcery.register.metals.foreach('sorcery:mkingot',{'sorcery:mkfrag'}, function(k,v)
		local ingot = 'sorcery:' .. k .. '_ingot'
		print('registered',ingot)
		v.parts = v.parts or {}
		v.parts.ingot = ingot;
	end)

	sorcery.registry.defercheck()

	sorcery.register.metals.link('washingtonium', {
		desc = "Washingtonium";
	})

	sorcery.register.metals.foreach('sorcery:mkfrag',{}, function(k,v)
		local fragment = 'sorcery:' .. k .. '_fragment'
		print('registered',fragment)
		v.parts = v.parts or {}
		v.parts.fragment = fragment;
	end)

	sorcery.register.metals.link('biloxite', {
		desc = "Biloxite";
	})
	
	dump(metals)
	if sorcery.registry.defercheck() then
		print('lingering deferments!')
	else
		print('all good!')
	end
end

Added sorcery.md version [f0c3989e05].













































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# sorcery

`sorcery` is a wide-ranging mod that adds many features, devices, powers, and mechanics to the minetest default game. it aims to add a distinctive cosmology, or world-system, to the game, based around mese, alchemy, spellcasting, and worship. it is intended to be pro-social, lore-flexible, and to interoperate well with other mods wherever possible.

# dependencies

## first-party
 * default
 * stairs
 * screwdriver
 * vessels

## third-party
 * **xdecor** for various tools and ingredients, especially honey and the hammer
 * **basic_materials** for crafting ingredients
 * **instant_ores** for ore generation. temporary, will be removed and replaced with home-grown mechanism soon
 * **farming redo** for potion ingredients
 * **late** for spell, potion, and gravitator effects
   * **note**: in order for the gravitator to work, the late condition interval must be lowered from its default of 1.0 to 0.1. this currently can only be done by altering a variable at the top of conditions.lua, though a note in the source suggests a configuration option will be added eventually. hopefully this is so.

# interoperability
sorcery has special functionality to ensure it can cooperate with various other modules, although they are not required for it to function.

## xdecor
by default, `sorcery` disables the xdecor enchanter, since `sorcery` offers its own, much more sophisticated enchantment mechanism. however, the two can coexist if you really want; a configuration flag can be used to prevent `sorcery` disabling the xdecor enchanter.

## hopper
many `sorcery` devices support interactions with the hopper. devices that produce outputs after a period of time like the infuser will automatically inject their output into a hopper if one is placed below it, and if the device has multiple slots, they can usually be accessed by configuring a hopper to insert from the side or from above.

## others
* if `moreores` is in use, `sorcery` will use its silver rather than creating its own. mithril is not used by `sorcery`.
* `sorcery` will use `new_campfire`'s ash if it's available, otherwise creating its own.

# lore
`sorcery` supplies a default system of lore (that is, the arbitrary objects that the basic principles of the setting operate over) but this can be augmented or replaced on a per-world basis. for instance, you can substitute your own gods for the Harvest Goddess, Blood God, change their names, and so on, or simply make your own additions to the pantheon. since lore overrides are stored outside the minetest tree, it can be updated without destroying your changes.

lore is stored separately from the rest of the game logic, in the 'data' directory of the `sorcery` mod. it is arranged in a hierarchy of thematically-organized tables. for instance, the table of gods can be found in data/gods.lua. ideally, lore tables should contain plain data, though they can also contain lambdas if necessary. lore files are evaluated in the second stage of the init process, after library code has been loaded but before any game logic has been instantiated. lore can thus depend on libraries where reasonable (though e.g. colors should be stored as 3-tuples rather than `sorcery.lib.color` objects, and images as texture strings, unless there is a very good reason to do otherwise).

lore files should never depend on functions in the `minetest` or `core` namespace! if you really need such functionality, gate it off with an if statement and be sure to return something useful in the event that the namespace isn't defined. *lore is just data:* as a general principle, non-minetest code should be able to evaluate and make use of the lore files, for instance to produce an HTML file tabulating the various potions and how to create them. lore should also not mutate the global environment: while there is currently nothing preventing it from doing so, steps will likely be taken in the future to give each lore module a clean environment to keep it from contaminating the global namespace. right now, all functions and variables declared in a lore file should be defined `local`. the only job of a lore file is to return a table.

`sorcery` looks in a directory called `sorcery` in the world-data directory for world-specific lore and other overrides. below are three example lore modifications to give you a sense for how this system works.

## replacing the gods
this is probably the most common action you'll want to take -- if your world has its own defined setting and already has its own gods, or you just want to give it a bit of a local flavor, you probably won't want the default pantheon that `sorcery` comes with.

to do this, we'll need to create a file called `$world/sorcery/lore-gods.lua` where $world is the world's root data directory, e.g. `/srv/mt/geographica`

```
-- /srv/mt/geographica/sorcery/lore-gods.lua

return {
	fire = {
		name = 'Aduram the Scorching';

		-- personality
		laziness = 3; -- controls how frequently the god takes action upon the mortal world
		stinginess = 5; -- the higher the stinginess value, the less frequently the god will give gifts to worshippers
		generosity = 7; -- likeliness to overlook disfavored behavior and give items of high value
		color = {255,0,0};

		idol = {
			desc = 'Fiery Idol';
			width = 0.5, height = 1;
			tex = { ‹list of textures› };
		};
		sacrifice = {
			['tnt:gunpowder'] = 2; -- players can leave gunpowder on his altars to gain 2 points of favor
		};
		gifts = {
			['fire:flint'] = {30, 3}; -- one-in-three likelihood of gifting flint at idols that have reached 30 favor
		};
		consecrate = {
			['default:steel_ingot'] = {5, 'fire:flint_and_steel'} -- transform steel ingots on his altar into firestarter at a cost of 5 favor
		};
		bless = {
			potions = {
				Force = {favor=70, cost=5, chance=15} -- 1-in-15 chance of applying the Elixir of Force effect to a potion on his altar once the attached idol has reached 30 favor, at a cost of 5 favor
			};
			tools = {
				speed = {favor=120, cost=25, chance=5} -- apply speed enchantment
			};
		}
	};
	water = {
		name = 'Uskaluth the Drenched';
		‹···›
	};
}
```

when you define gods, be mindful of the personality you wish to create and worship practices you wish to provoke. how attentive must their worshippers be to maintain a useful relationship? how often are sacrifices required? how many sacrifices are necessary before the god will start performing miracles? it's easy to make gods completely overpowered gamebreakers, so be cautious, and don't gift anything terribly valuable -- or if you do, give it very rarely.

note that you would also need to supply idol models called `sorcery-idol-fire.obj` and `sorcery-idol-water.obj`. gods with the ids `harvest` or `blood` will use predefined idols.

## adding gods
if you're happy with the default pantheon, but your spiritual life just isn't complete without the fiery rage of Aduram, you can change the name of `sorcery/lore-gods.lua` to `sorcery/lore-gods-extra.lua`. this way, the table it returns will be merged preferentially into the table of default gods.

## modifying gods
more complex operations can also be performed. let's say the Blood God is ruining your vibe and you want to delete him (her? it?) from the pantheon. or the Harvest Goddess needs a name more in line with your local cosmology. these are both easy:

```
-- /srv/mt/geographica/sorcery/lore-gods.lua
local gods = ...
gods.harvest.name = 'Disastra bel-Malphegor'
gods.blood = nil
return gods
```

this has the handy property that any changes made upstream to the Harvest Goddess will be respected if you update the mod, without overriding the changes made in lore-gods.lua.

or, if you want to extract a specific god from the default pantheon and include it with your own:

```
-- /srv/mt/geographica/sorcery/lore-gods.lua
local gods = ...
local mygods = dofile('pantheon.lua')
mygods.harvest = gods.harvest
mygods.harvest.name = 'Disastra bel-Malphegor'
return mygods
```

## compatibility tables
if you use a mod that neither supports `sorcery` nor is supported by it, the proper solution is of course to open a ticket in the former's bug tracker, but as a quick fix you can also tweak the `sorcery` compatibility tables with a `$world/sorcery/lore-compat.lua` file.

```
-- /srv/mt/geographica/sorcery/lore-compat.lua
return sorcery.lib.tbl.deepmerge((...), {
	grindables = {
		['bonemeal:bone'] = {
			powder = 'bonemeal:bonemeal';
			hardness = 3;
			value = 3;
			grindcost = 1;
		};
	};
})
```

note that we have to use deepmerge instead of naming the file `lore-compat-extra.lua` and returning a simple table because the init routine only performs a shallow merge, meaning that it would wipe out the entire provided version of `sorcery.data.compat.grindables`! no bueno.

## local tweaks
if you need to change `sorcery`'s behavior in a way that isn't possible through modifying the lore, you can create a file `$world/sorcery/finalize.lua` which will be run at the end of the init process and which will have access to all of the machinery created by the various modules of the mod. `worldbuilding.lua` is like `finalize.lua` but it is run before any lore is loaded. finally, `bootstrap.lua` will be run before anything else, including library code, is loaded, but after the core `sorcery` structure and its loading functions have been created.

in the unlikely event that the lore-loading process itself is incompatible with the changes you're trying to make, you can create a `loadlore.lua` file that will be run instead of the usual routine. you'll then be responsible for loading all of the game's lore; the default lore will not even be read! this will be most useful if you're loading or generating your own lore from an unusual source, such as somewhere on the network.

if you want to write a lore loader but include some of the default lore, you can use the loading function passed to `loadlore.lua`:

```
-- /srv/mt/geographica/loadlore.lua
local load_lore, load_module = ...
sorcery.data = dofile('load-remote-lore.lua')
load_lore {'enchants', 'spells'}
```

as you can see here, once the lore is loaded, it is stored in the variable `data`. there is a subtle distinction you need to bear in mind: `data` represents the full set of lore-derived information `sorcery` has to work with, which is not necessarily the same as the lore itself. for example, certain modules could generate extra information and attach them to the entries in the `data` table, which can be (and is) written to at runtime. the one invariant that the `data` table should observe is that once a record is added, it may neither be mutated nor removed (though additional sub-records can always be added) -- `sorcery` is not written to handle such eventualities and it may produce anything from glitches to crashes. the term `lore` references specifically the core records stored on disk from which the `data` table is generated, and a `lorepack` is a full, integrated collection of lore. (there are cases where modifying or deleting from `data` may be necessary for a `sorcery`-aware mod, for instance to prevent players from creating a certain default potion, but this is very fraught and you should only ever do it if you thoroughly understand the internals and exactly what you're doing, with the caveat that what works in this version may break the next.)

# writing sorcery-aware mods
`sorcery` exposes an API that is usable by other mods. to use it, you need to understand a little about how `sorcery` handles lore. local tweaks are simple because they inject changes into the pipeline before `sorcery` makes use of any of the lore. part of the setup stage is the creation of various lore-derived recipes, items, nodes, and so on. so if your mod loads after `sorcery` is finished loading (which it must, if it expects to call into the `sorcery` API), it can't take advantage of the same mechanism that world tweaks can, as it needs to not just insert the data but notify `sorcery` that something has been added so it can create the appropriate objects.

to handle this complex situation, `sorcery` uses *registers.* a register is set of functions and data used for tracking actions and dependencies between them. registers are automatically created for each lore category, except those specifically excluded by the bootstrapping routine. for instance, the extract register can be found at `sorcery.register.extract`. a register has several functions, only three of which are relevant to you: `link`, `meld`, and `foreach`.

## link
`link([key,] value)` inserts a new entry into the database the register manages. so to add a new extract for, say, sand, we could call `sorcery.register.extracts.link('sand',{'default:sand',{255,255,0})`. this would insert the record `sand => {'default:sand, {255,255,0}}` into `sorcery.data.extracts`. it would also take all of the actions that would have been taken if the entry had been present in `sorcery.data.extracts` when the `sorcery` mod bootstrapped itself.

```
sorcery.register.infusion.link {
	infuse = 'farming:sugar';
	into = 'sorcery:potion_serene';
	output = 'mymod:sweet_potion';
}
sorcery.register.residue.link('farming:sugar','sorcery:ash')
```

this will permit use of the infuser to create a **Sweet Potion** (presumably defined by your own mod) by infusing **sugar** into a **Serene Potion**, leaving behind **ash**.

new alloys can also be registered for use with the smelter:

```
sorcery.register.alloys.link {
	output = {
		[1] = 'mymod:excelsium_fragment';
		[4] = 'mymod:excelsium_ingot';
		[4 * 9] = 'mymod:excelsium_block';
	};
	cooktime = 69;
	metals = {
		lithium = 1;
		silver = 4;
		aluminum = 4;
	};
}
```

this defines an alloy called Excelsium that can be produced by mixing four parts silver, four parts aluminum, and one part lithium -- e.g. one lithium fragment, one aluminum ingot, and one silver ingot. `metals` must specify metals registered with the `sorcery` mod; `output` can be either the name of a registered metal or a table of items and part-values that can be produced. at least output[1] must always be present!

the kiln is not currently functional, but once it is, it will be possible to create kiln recipes with the `sorcery.register.kilnrecs.link` function.

## foreach
`foreach(id,deps,fn)` should be called for any registration actions that need to take place for a registry's contents. let's say you want to create a container than holds large volumes of an extract, like an extract keg. to do this, you'd need to create a node for each extract. but you can't just iterate `sorcery.data.extracts` because new extracts might be added long after your code is run. the solution is `foreach`: you give it an identifier, a list of dependency identifiers, and a function, and it then ensures that function will be called once for everything that winds up in `sorcery.data.extracts`.

it is crucial to understand the difference between a data `for` loop and registry `foreach`, because they are not interchangeable. a function passed to `foreach` may be called immediately, ten minutes later, both, or never (if there are missing dependencies). for instance, you cannot write a function that uses `foreach` to tally the mass of all metals, because it would run whenever a new metal was created, long after your function had stopped running, and it would only run once ever for each metal. in that case, you would need to use `for`.

let's consider our keg storage mod. we would want to create several things: first, the individual per-extract keg nodes; second, a node that takes an empty keg and, say, 99 of an extract, and transforms them into an extract keg. to register the kegs, we might use code like

```
minetest.register_node('keg:empty', { description = 'Empty Keg'; ‹···›})
sorcery.register.extracts.foreach('keg:generate',{},function(name,data)
	minetest.register_node('keg:extract_' .. name, {
		description = sorcery.lib.str.capitalize(name) .. ' Extract Keg';
		color = sorcery.lib.color(data[2]):hex();
		‹···›
	})
end)
```

but in the on_metadata_inventory_put code for keg-filling node, to identify the proper keg, we might instead use code like

```
local inv = minetest.get_meta(pos):get_inventory()
local fluid = inv:get_stack('fluid',1)
if fluid:get_count() < 99 then return end

local fname = fluid:get_name()
if minetest.get_item_group(fname, 'sorcery_extract') ~= 0 then
	for k,v in pairs(sorcery.data.extracts)
		if fname == 'sorcery:extract_' .. k then
			inv:set_stack('preview',1,ItemStack('keg:extract_' .. k))
			return
		end
	end
end
```

`foreach` could NOT be used in this case.

every time you register a `foreach`, you need to give it a unique identifier and list its dependencies. the identifier need only be unique among functions linked to that specific registry. dependencies are used so that when new items are linked to a registry, the queued functions are executed in the correct order. for instance, if you had a foreach function in the extracts registry that modified the definition table of the keg nodes, you would need to list `'keg:generate'` in its dependency array.

spelling dependencies correctly is crucial. if you call `foreach` with the name of a dependency that is not yet known to the registry, it will not be executed until that dependency is added. so if you misspell a dependency, the `foreach` function you add will never execute!

it's helpful therefore to insert calls to `sorcery.registry.defercheck()` at code boundaries, e.g. the end of your init file. this will print a warning to the logs and return false if there are any deferred iterators that have not yet been run. otherwise it will silently return true. `sorcery` checks its own iterators this way.

## meld
registries also have the `meld(tbl)` convenience function, which is useful if you have a `sorcery`-like lore table you want to merge in, say a table of metals your mod adds. in this case, you could simply call `sorcery.register.metals.meld(mymod.data.metals)` instead of faffing around with for loops.

## creating registries
you're not restricted to the registries already in existence. you can create registries of your own with the function `sorcery.registry.mk(name[,db])`. this will create (or overwrite!) registries in the `sorcery.register` table, and return a reference to that registry. the db argument can be absent, in which case it will look for a database under `sorcery.data[name]` or fail if one cannot be found. this will generally not be what you want if you're using it from another mod, so you'll want to either pass a reference to an existing table under your control, or the argument `false` which will tell `mk` to create a store in the registry itself under the table `db`, which is useful for ephemeral data that is generated entirely at runtime from existing lore entries like alloys or infusion residue.

Modified wands.lua from [a570130d91] to [2dc21e25ed].

32
33
34
35
36
37
38









39
40
41
42
43
44
45
...
368
369
370
371
372
373
374






375
376
377
378
379
380
381
...
698
699
700
701
702
703
704

705
706
707
708
709
710
711
			};
		};
		core = {
			obsidian = {
				item = 'default:obsidian_shard';
				sturdiness = 1.5;
			};









			cobalt = {
				item = 'sorcery:powder_cobalt';
				power = 1.4;
			};
			iridium = {
				item = 'sorcery:powder_iridium';
				sturdiness = 1.25;
................................................................................
				after_dig_node = function(pos,node,meta,digger)
					local stack = meta.inventory.wand[1]
					if stack and not stack:is_empty() then
						-- luv 2 defensive coding
						minetest.add_item(pos, stack)
					end
				end;






				on_rightclick = function(pos,node,user,stack)
					local meta = minetest.get_meta(pos)
					local stand = meta:get_inventory()
					local wand = stand:get_stack('wand',1)
					if stack:is_empty() then
						stack = wand
					else
................................................................................
		"default_aspen_wood.png";
		"sorcery_wandworking_station_side.png";
	}
	local base = {
		description = "Wandworking Station";
		groups = {
			choppy = 2;

		};
		paramtype2 = 'facedir';
		on_construct = function(pos)
			local meta = minetest.get_meta(pos)
			local inv = meta:get_inventory()
			inv:set_size('tank',4)
			inv:set_size('input',1)







>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>







 







>







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
...
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
...
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
			};
		};
		core = {
			obsidian = {
				item = 'default:obsidian_shard';
				sturdiness = 1.5;
			};
			diamond = {
				item = 'sorcery:shard_diamond';
				sturdiness = 1.7;
				reliability = 0.75;
			};
			mese = {
				item = 'default:mese_fragment';
				generate = 2;
			};
			cobalt = {
				item = 'sorcery:powder_cobalt';
				power = 1.4;
			};
			iridium = {
				item = 'sorcery:powder_iridium';
				sturdiness = 1.25;
................................................................................
				after_dig_node = function(pos,node,meta,digger)
					local stack = meta.inventory.wand[1]
					if stack and not stack:is_empty() then
						-- luv 2 defensive coding
						minetest.add_item(pos, stack)
					end
				end;
				groups = {
					not_in_creative_inventory = 1;
					sorcery_wand_stand = 1;
					choppy = 2;
					oddly_breakable_by_hand = 2;
				};
				on_rightclick = function(pos,node,user,stack)
					local meta = minetest.get_meta(pos)
					local stand = meta:get_inventory()
					local wand = stand:get_stack('wand',1)
					if stack:is_empty() then
						stack = wand
					else
................................................................................
		"default_aspen_wood.png";
		"sorcery_wandworking_station_side.png";
	}
	local base = {
		description = "Wandworking Station";
		groups = {
			choppy = 2;
			not_in_creative_inventory = water and 1 or nil;
		};
		paramtype2 = 'facedir';
		on_construct = function(pos)
			local meta = minetest.get_meta(pos)
			local inv = meta:get_inventory()
			inv:set_size('tank',4)
			inv:set_size('input',1)