#!/usr/bin/env python3

import re
import sys

pattern = re.compile('^.*MEMTRACE (.*) context (.*) chunk (.*) size (.*) location (.*)$')

allocations = {}

backtraces_ids = []
backtraces = {}

ncalls = 0
for line in sys.stdin:

	line = line.strip()

	r = pattern.match(line)

	action = r.group(1)
	context = r.group(2)
	chunk = r.group(3)
	size = int(r.group(4))
	location = r.group(5)

	if action == 'allocate':

		if location not in backtraces:
			backtraces.update({location: {'count' : 0, 'size' : 0, 'total_count' : 0, 'total_size': 0, 'id' : len(backtraces_ids)}})
			backtraces_ids.append(location)

		if chunk in allocations:
			print(f'ERROR: chunk {chunk} already exists')

		allocations.update({chunk : {'context': context, 'chunk': chunk, 'size': size, 'location': backtraces[location]['id']}})

		backtraces[location]['total_size'] += size
		backtraces[location]['size'] += size

		backtraces[location]['total_count'] += 1
		backtraces[location]['count'] += 1

	elif action == 'free':

		if chunk not in allocations:
			print(f'ERROR: chunk {chunk} does not exist')
		else:
			tmp = allocations[chunk]

			backtraces[backtraces_ids[tmp['location']]]['size'] -= tmp['size']
			backtraces[backtraces_ids[tmp['location']]]['count'] -= 1

			if backtraces[backtraces_ids[tmp['location']]]['count'] < 0:
				print('ERROR: negative count for location', backtraces_ids[tmp['location']])
				sys.exit(1)

			if backtraces[backtraces_ids[tmp['location']]]['size'] < 0:
				print('ERROR: negative size for location', backtraces_ids[tmp['location']])
				sys.exit(1)

			del allocations[chunk]

	else:
		print(action)
		sys.exit(1)

	ncalls += 1

	if ncalls % 1000000 == 0:

		values = []
		for v in backtraces.items():
			x = v[1]
			x.update({'location' : v[0]})
			values.append(x)

		values.sort(key=lambda item: item['total_size'], reverse=True)

		total_size = sum([v['total_size'] for v in values])
		total_count = sum([v['total_count'] for v in values])
		size = sum([v['size'] for v in values])
		count = sum([v['count'] for v in values])

		print('========================================================================================================')

		print(f'  TOTAL COUNT {total_count} SIZE {total_size}')
		print(f'CURRENT COUNT {count} SIZE {size}')

		print(f'total size\ttotal count\tsize\tcount\tbacktrace')

		for v in values:
			count = v['count']
			size = v['size']
			total_count = v['total_count']
			total_size = v['total_size']

			location = v['location']
			print(f'EXPORT\t{ncalls}\t{total_size}\t{total_count}\t{size}\t{count}\t"{location}"\n')

			location = v['location'].replace('/', '\n\t\t\t\t\t\t\t')
			print(f'{total_size}\t{total_count}\t\t{size}\t{count}\t\t{location}\n')



values = []
for v in backtraces.items():
	x = v[1]
	x.update({'location' : v[0]})
	values.append(x)

values.sort(key=lambda item: item['total_size'], reverse=True)

total_size = sum([v['total_size'] for v in values])
total_count = sum([v['total_count'] for v in values])
size = sum([v['size'] for v in values])
count = sum([v['count'] for v in values])

print('========================================================================================================')

print(f'  TOTAL COUNT {total_count} SIZE {total_size}')
print(f'CURRENT COUNT {count} SIZE {size}')

print(f'total size\ttotal count\tsize\tcount\tbacktrace')

for v in values:
	count = v['count']
	size = v['size']
	total_count = v['total_count']
	total_size = v['total_size']

	location = v['location']
	print(f'EXPORT\t{ncalls}\t{total_size}\t{total_count}\t{size}\t{count}\t"{location}"\n')

	location = v['location'].replace('/', '\n\t\t\t\t\t\t\t')
	print(f'{total_size}\t{total_count}\t\t{size}\t{count}\t\t{location}\n')
