amuse.git

commit 6385719d82a8e1642c55339209461f675ab8e22f

Author: Adam <git@apiote.tk>

tidy structure

 go.mod | 4 
 go.sum | 48 -
 mkfile | 13 
 protocol/amuse.proto | 73 --
 protocol/amuse.proto.go | 1126 -------------------------------------------
 protocol/film.go | 100 ---
 protocol/makefile | 2 


diff --git a/go.mod b/go.mod
index b72aafa49b3fae1a42889bd08d3d0eded0001da6..78deeb62f13e486a2cb4a055f7c8cf8729e432f8 100644
--- a/go.mod
+++ b/go.mod
@@ -8,18 +8,18 @@ 	github.com/alecthomas/chroma v0.7.2 // indirect
 	github.com/bytesparadise/libasciidoc v0.4.0
 	github.com/chai2010/webp v1.1.0
 	github.com/dlclark/regexp2 v1.2.0 // indirect
-	github.com/go-python/gopy v0.3.1
 	github.com/knakk/digest v0.0.0-20160404164910-fd45becddc49 // indirect
 	github.com/knakk/rdf v0.0.0-20190304171630-8521bf4c5042 // indirect
 	github.com/knakk/sparql v0.0.0-20191213045353-fd0bd0e76475
 	github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
 	github.com/mattn/go-sqlite3 v2.0.3+incompatible
 	github.com/onsi/ginkgo v1.12.0 // indirect
-	github.com/onsi/gomega v1.7.1 // indirect
+	github.com/philhofer/fwd v1.1.0 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pquerna/otp v1.2.0
 	github.com/sirupsen/logrus v1.5.0 // indirect
 	github.com/stretchr/testify v1.4.0 // indirect
+	github.com/tinylib/msgp v1.1.2 // indirect
 	golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5
 	golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f // indirect
 	golang.org/x/text v0.3.2




diff --git a/go.sum b/go.sum
index 4011a704db57a6ac454fdb8116494b3507666825..4d351f85b9f0973f487f402132fa83ab08155eaa 100644
--- a/go.sum
+++ b/go.sum
@@ -1,17 +1,18 @@
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
 github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
 github.com/alecthomas/chroma v0.7.1 h1:G1i02OhUbRi2nJxcNkwJaY/J1gHXj9tt72qN6ZouLFQ=
 github.com/alecthomas/chroma v0.7.1/go.mod h1:gHw09mkX1Qp80JlYbmN9L3+4R5o6DJJ3GRShh+AICNc=
 github.com/alecthomas/chroma v0.7.2 h1:B76NU/zbQYIUhUowbi4fmvREmDUJLsUzKWTZmQd3ABY=
 github.com/alecthomas/chroma v0.7.2/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s=
+github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo=
 github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
 github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI=
+github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY=
 github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
 github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
 github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/bytesparadise/libasciidoc v0.2.0 h1:W+Yh4cXehuQvFA+Ncs4tIgwBXiH8ie+KhHmMXkBhIcc=
-github.com/bytesparadise/libasciidoc v0.2.0/go.mod h1:CZX8GIEkxy/LHrDZjPbNrE16RQFDrnG6hBjnjXcD34Y=
 github.com/bytesparadise/libasciidoc v0.4.0 h1:fse9nKBTZ1OcAltOhf5XJUxctakbiaDT3Jw6qCPaM7Y=
 github.com/bytesparadise/libasciidoc v0.4.0/go.mod h1:fNxeS06tJufiBEyZJXnO0ng4xv8EdlswK/tKStNz/MA=
 github.com/chai2010/webp v1.1.0 h1:4Ei0/BRroMF9FaXDG2e4OxwFcuW2vcXd+A6tyqTJUQQ=
@@ -25,15 +26,11 @@ github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg=
 github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk=
 github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/go-python/gopy v0.3.1 h1:l0zBAjU89xGoFBR12NTK+JGj6O2dCqRB/rDTN44APBY=
-github.com/go-python/gopy v0.3.1/go.mod h1:gQ2Itc84itA1AjrVqnMnv7HLkfmNObRXlR1co7CXpbk=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/gonuts/commander v0.1.0 h1:EcDTiVw9oAVORFjQOEOuHQqcl6OXMyTgELocTq6zJ0I=
-github.com/gonuts/commander v0.1.0/go.mod h1:qkb5mSlcWodYgo7vs8ulLnXhfinhZsZcm6+H/z1JjgY=
-github.com/gonuts/flag v0.1.0 h1:fqMv/MZ+oNGu0i9gp0/IQ/ZaPIDoAZBOBaJoV7viCWM=
-github.com/gonuts/flag v0.1.0/go.mod h1:ZTmTGtrSPejTo/SRNhCqwLTmiAgyBdCkLYhHrAoBdz4=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -41,20 +38,15 @@ github.com/knakk/digest v0.0.0-20160404164910-fd45becddc49 h1:P6Mw09IOeKKS4klYhjzHzaEx2RcNshynjfDhzCQ8BoE=
 github.com/knakk/digest v0.0.0-20160404164910-fd45becddc49/go.mod h1:dQr9I8Xw26daWGE/crxUleRxmpFI5uhfedWqRNHHq0c=
 github.com/knakk/rdf v0.0.0-20190304171630-8521bf4c5042 h1:Vzdm5hdlLdpJOKK+hKtkV5u7xGZmNW6aUBjGcTfwx84=
 github.com/knakk/rdf v0.0.0-20190304171630-8521bf4c5042/go.mod h1:fYE0718xXI13XMYLc6iHtvXudfyCGMsZ9hxSM1Ommpg=
-github.com/knakk/sparql v0.0.0-20190415133729-e66682c662f6 h1:/9NsggFoqFNblbAcHDeeAX9tiYnT6TteCUS80zanCGA=
-github.com/knakk/sparql v0.0.0-20190415133729-e66682c662f6/go.mod h1:vxUbHrxs7JHQF6LITj9Rp9yf2bqyz+5JZzPZkEkS3MA=
 github.com/knakk/sparql v0.0.0-20191213045353-fd0bd0e76475 h1:J75ktE0AJuhyTqS6V8cBHNLeCEv5XbW58g9r3Zpyz4k=
 github.com/knakk/sparql v0.0.0-20191213045353-fd0bd0e76475/go.mod h1:vxUbHrxs7JHQF6LITj9Rp9yf2bqyz+5JZzPZkEkS3MA=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kuangchanglang/graceful v1.0.0 h1:EPcA4vV75CkLi9+tW1+cd6KpfULYRTxTm1MO8USa49k=
-github.com/kuangchanglang/graceful v1.0.0/go.mod h1:fQkb+p3PRjvdiAsa65Qv78lm9CsYc4M+yhiuU1rOVtg=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-sqlite3 v2.0.2+incompatible h1:qzw9c2GNT8UFrgWNDhCTqRqYUSmu/Dav/9Z58LGpk7U=
-github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -64,13 +56,13 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA=
 github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY=
-github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/philhofer/fwd v1.1.0 h1:PAdZw9+/BCf4gc/kA2L/PbGPkFe72Kl2GLZXTG8HpU8=
+github.com/philhofer/fwd v1.1.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -79,10 +71,9 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok=
 github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
+github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q=
 github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
 github.com/sozorogami/gover v0.0.0-20171022184752-b58185e213c5 h1:TAPeDBsd52dRWoWzf5trgBzxzMYHTYjYI+4xNyCdoCU=
@@ -95,13 +86,13 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
+github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200420201142-3c4aac89819a h1:y6sBfNd1b9Wy08a6K1Z1DZc4aXABUN5TKjkYhz7UKmo=
-golang.org/x/crypto v0.0.0-20200420201142-3c4aac89819a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5 h1:Q7tZBpemrlsc2I7IyODzhtallWRSm4Q0d09pL6XbQtU=
 golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -111,8 +102,7 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191116160921-f9c825593386 h1:ktbWvQrW08Txdxno1PiDpSxPXG6ndGsfnJjRRtkM0LQ=
-golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -133,21 +123,17 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190830223141-573d9926052a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191204011308-9611592c72f6 h1:BP62y4oUl8+/CvHuvVqHIPmVRixgDl6y6a+tR7pXXIA=
-golang.org/x/tools v0.0.0-20191204011308-9611592c72f6/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191220234730-f13409bbebaf h1:K7C8vSrr0PeD/cgNkkjpByDFJqzjr2YDmm3VPRjGfJM=
 golang.org/x/tools v0.0.0-20191220234730-f13409bbebaf/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e h1:3Dzrrxi54Io7Aoyb0PYLsI47K2TxkRQg+cqUn+m04do=
-golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200423205358-59e73619c742 h1:9OGWpORUXvk8AsaBJlpzzDx7Srv/rSK6rvjcsJq4rJo=
 golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
@@ -156,16 +142,8 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
-gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-notabug.org/apiote/gott v1.0.1 h1:yfq2z3WM0lYFSu6xFvh1sWBKgg6yaXwF9/2wqJiKky8=
-notabug.org/apiote/gott v1.0.1/go.mod h1:Z9hFvCdzZkFSegBkLa6n0X6AuUiw2BwgG4MFLgBMjD4=
-notabug.org/apiote/gott v1.1.0 h1:RGGbJo9ON5Qsk/lsw0oF1tiyFeogORINGILqizbdkC8=
-notabug.org/apiote/gott v1.1.0/go.mod h1:Z9hFvCdzZkFSegBkLa6n0X6AuUiw2BwgG4MFLgBMjD4=
-notabug.org/apiote/gott v1.1.1 h1:BFKdZnZPCTZa8BrEGVSmMYhkgXD30aR9JBPcxMw1Rnc=
-notabug.org/apiote/gott v1.1.1/go.mod h1:Z9hFvCdzZkFSegBkLa6n0X6AuUiw2BwgG4MFLgBMjD4=
 notabug.org/apiote/gott v1.1.2 h1:Z22X9/8XrK5M5oARoE2fh3sJGPAJ84GuyGg2nKOjweQ=
 notabug.org/apiote/gott v1.1.2/go.mod h1:Z9hFvCdzZkFSegBkLa6n0X6AuUiw2BwgG4MFLgBMjD4=
 zombiezen.com/go/capnproto2 v2.17.0+incompatible h1:sIoKPFGNlM38Qh+PBLa9Wzg1j99oInS/Qlk+5N/CHa4=




diff --git a/mkfile b/mkfile
index b7ded0a37160621596ec7b6fd9a88dfad30e7b87..7b0523d2bbade57c9f07ca8aa51c926cebdd9d3d 100644
--- a/mkfile
+++ b/mkfile
@@ -3,7 +3,7 @@
 all:V: $ALL
 reallyall:V: $ALL pymodule
 
-amuse: main.go router.go go.mod go.sum `echo front/*.go i18n/*.go libamuse/*.go protocol/*.go tmdb/*.go utils/*.go wikidata/*.go inventaire/*.go db/*.go datastructure/*.go network/*.go accounts/*.go`
+amuse: main.go router.go go.mod go.sum `echo front/*.go i18n/*.go libamuse/*.go tmdb/*.go utils/*.go wikidata/*.go inventaire/*.go db/*.go datastructure/*.go network/*.go accounts/*.go`
 	go build -ldflags "-s -w -linkmode external -extldflags -static"
 static/img/%.webp: static/img/%.svg
 	rendersvg static/img/$stem.svg static/img/$stem.png
@@ -31,11 +31,6 @@ uninstall:V:
 	rm $PREFIX/bin/amuse
 	rm -r $PREFIX/share/amuse
 
-# https://github.com/go-python/gopy
-pymodule:QV: `echo **/*.go`
-	echo "NOTE: This only works with glibc"
-	gopy build -output pymodule notabug.org/apiote/amuse/libamuse
-	cd pymodule
-	go build -ldflags "-s -w" -buildmode=c-archive -o libamuse_go.a .
-	gcc libamuse.c libamuse_go.a -o _libamuse.so $(python3.7-config --cflags) $(python3.7-config --ldflags) -fPIC --shared
-	rm -f Makefile __pycache__ build.py libamuse.c libamuse_go.h __init__.py libamuse.go libamuse_go.so libamuse_go.a
+zip:V: amuse.tgz
+amuse.tgz: amuse
+	tar czf amuse.tgz templates i18n/??-??.toml static amuse




diff --git a/protocol/amuse.proto b/protocol/amuse.proto
deleted file mode 100644
index 0a9336e08ac3c5fbdcc60ffff92cc4748713259a..0000000000000000000000000000000000000000
--- a/protocol/amuse.proto
+++ /dev/null
@@ -1,73 +0,0 @@
-using Go = import "/go.capnp";
-@0xcd7129bab3129d29;
-$Go.package("protocol");
-$Go.import("protocol");
-
-struct Film {
-	id @0 :UInt64;
-	title @1 :Text;
-	genres @2 :List(Text);
-	releaseDate @3 :Date;
-
-	struct Date {
-		year @0 :Int16;
-		month @1 :UInt8;
-		day @2 :UInt8;
-	}
-
-	originalTitle @4 :Text;
-	overview @5 :Text;
-	tagline @6 :Text;
-	runtime @7 :UInt16;
-	isAdult @8 :Bool;
-	mark @9 :Float32;
-	voteCount @10 :UInt64;
-
-	status @11 :Status;
-
-	enum Status {
-		rumored @0         $Go.tag("Rumored");
-		planned @1         $Go.tag("Planned");
-		inProduction @2    $Go.tag("In Production");
-		postProduction @3  $Go.tag("Post Production");
-		released @4        $Go.tag("Released");
-		cancelled @5       $Go.tag("Cancelled");
-	}
-
-	posterPath @12 :Text;
-	backdropPath @13 :Text;
-	
-	collection @14 :Collection;
-
-	struct Collection {
-		name @0 :Text;
-		parts @1 :List(CollectionPart);
-
-		struct CollectionPart {
-			id @0 :UInt64;
-			title @1 :Text;
-			releaseDate @2 :Date;
-			posterPath @3 :Text;
-		}
-	}
-
-	cast @15 :List(Character);
-
-	struct Character {
-		person @0 :Person;
-		name @1 :Text;
-	}
-
-	crew @16: List(CrewMember);
-
-	struct CrewMember {
-		person @0 :Person;
-		job @1 :Text;
-	}
-}
-
-struct Person {
-	id @0 :UInt64;
-	name @1 :Text;
-	photoPath @2 :Text;
-}




diff --git a/protocol/amuse.proto.go b/protocol/amuse.proto.go
deleted file mode 100644
index d65d28d24e62a43d79c4ab7b4158ed690babad55..0000000000000000000000000000000000000000
--- a/protocol/amuse.proto.go
+++ /dev/null
@@ -1,1126 +0,0 @@
-// Code generated by capnpc-go. DO NOT EDIT.
-
-package protocol
-
-import (
-	math "math"
-	capnp "zombiezen.com/go/capnproto2"
-	text "zombiezen.com/go/capnproto2/encoding/text"
-	schemas "zombiezen.com/go/capnproto2/schemas"
-)
-
-type Film struct{ capnp.Struct }
-
-// Film_TypeID is the unique identifier for the type Film.
-const Film_TypeID = 0x8662baafda730202
-
-func NewFilm(s *capnp.Segment) (Film, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 32, PointerCount: 11})
-	return Film{st}, err
-}
-
-func NewRootFilm(s *capnp.Segment) (Film, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 32, PointerCount: 11})
-	return Film{st}, err
-}
-
-func ReadRootFilm(msg *capnp.Message) (Film, error) {
-	root, err := msg.RootPtr()
-	return Film{root.Struct()}, err
-}
-
-func (s Film) String() string {
-	str, _ := text.Marshal(0x8662baafda730202, s.Struct)
-	return str
-}
-
-func (s Film) Id() uint64 {
-	return s.Struct.Uint64(0)
-}
-
-func (s Film) SetId(v uint64) {
-	s.Struct.SetUint64(0, v)
-}
-
-func (s Film) Title() (string, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.Text(), err
-}
-
-func (s Film) HasTitle() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) TitleBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetTitle(v string) error {
-	return s.Struct.SetText(0, v)
-}
-
-func (s Film) Genres() (capnp.TextList, error) {
-	p, err := s.Struct.Ptr(1)
-	return capnp.TextList{List: p.List()}, err
-}
-
-func (s Film) HasGenres() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) SetGenres(v capnp.TextList) error {
-	return s.Struct.SetPtr(1, v.List.ToPtr())
-}
-
-// NewGenres sets the genres field to a newly
-// allocated capnp.TextList, preferring placement in s's segment.
-func (s Film) NewGenres(n int32) (capnp.TextList, error) {
-	l, err := capnp.NewTextList(s.Struct.Segment(), n)
-	if err != nil {
-		return capnp.TextList{}, err
-	}
-	err = s.Struct.SetPtr(1, l.List.ToPtr())
-	return l, err
-}
-
-func (s Film) ReleaseDate() (Film_Date, error) {
-	p, err := s.Struct.Ptr(2)
-	return Film_Date{Struct: p.Struct()}, err
-}
-
-func (s Film) HasReleaseDate() bool {
-	p, err := s.Struct.Ptr(2)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) SetReleaseDate(v Film_Date) error {
-	return s.Struct.SetPtr(2, v.Struct.ToPtr())
-}
-
-// NewReleaseDate sets the releaseDate field to a newly
-// allocated Film_Date struct, preferring placement in s's segment.
-func (s Film) NewReleaseDate() (Film_Date, error) {
-	ss, err := NewFilm_Date(s.Struct.Segment())
-	if err != nil {
-		return Film_Date{}, err
-	}
-	err = s.Struct.SetPtr(2, ss.Struct.ToPtr())
-	return ss, err
-}
-
-func (s Film) OriginalTitle() (string, error) {
-	p, err := s.Struct.Ptr(3)
-	return p.Text(), err
-}
-
-func (s Film) HasOriginalTitle() bool {
-	p, err := s.Struct.Ptr(3)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) OriginalTitleBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(3)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetOriginalTitle(v string) error {
-	return s.Struct.SetText(3, v)
-}
-
-func (s Film) Overview() (string, error) {
-	p, err := s.Struct.Ptr(4)
-	return p.Text(), err
-}
-
-func (s Film) HasOverview() bool {
-	p, err := s.Struct.Ptr(4)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) OverviewBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(4)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetOverview(v string) error {
-	return s.Struct.SetText(4, v)
-}
-
-func (s Film) Tagline() (string, error) {
-	p, err := s.Struct.Ptr(5)
-	return p.Text(), err
-}
-
-func (s Film) HasTagline() bool {
-	p, err := s.Struct.Ptr(5)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) TaglineBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(5)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetTagline(v string) error {
-	return s.Struct.SetText(5, v)
-}
-
-func (s Film) Runtime() uint16 {
-	return s.Struct.Uint16(8)
-}
-
-func (s Film) SetRuntime(v uint16) {
-	s.Struct.SetUint16(8, v)
-}
-
-func (s Film) IsAdult() bool {
-	return s.Struct.Bit(80)
-}
-
-func (s Film) SetIsAdult(v bool) {
-	s.Struct.SetBit(80, v)
-}
-
-func (s Film) Mark() float32 {
-	return math.Float32frombits(s.Struct.Uint32(12))
-}
-
-func (s Film) SetMark(v float32) {
-	s.Struct.SetUint32(12, math.Float32bits(v))
-}
-
-func (s Film) VoteCount() uint64 {
-	return s.Struct.Uint64(16)
-}
-
-func (s Film) SetVoteCount(v uint64) {
-	s.Struct.SetUint64(16, v)
-}
-
-func (s Film) Status() Film_Status {
-	return Film_Status(s.Struct.Uint16(24))
-}
-
-func (s Film) SetStatus(v Film_Status) {
-	s.Struct.SetUint16(24, uint16(v))
-}
-
-func (s Film) PosterPath() (string, error) {
-	p, err := s.Struct.Ptr(6)
-	return p.Text(), err
-}
-
-func (s Film) HasPosterPath() bool {
-	p, err := s.Struct.Ptr(6)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) PosterPathBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(6)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetPosterPath(v string) error {
-	return s.Struct.SetText(6, v)
-}
-
-func (s Film) BackdropPath() (string, error) {
-	p, err := s.Struct.Ptr(7)
-	return p.Text(), err
-}
-
-func (s Film) HasBackdropPath() bool {
-	p, err := s.Struct.Ptr(7)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) BackdropPathBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(7)
-	return p.TextBytes(), err
-}
-
-func (s Film) SetBackdropPath(v string) error {
-	return s.Struct.SetText(7, v)
-}
-
-func (s Film) Collection() (Film_Collection, error) {
-	p, err := s.Struct.Ptr(8)
-	return Film_Collection{Struct: p.Struct()}, err
-}
-
-func (s Film) HasCollection() bool {
-	p, err := s.Struct.Ptr(8)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) SetCollection(v Film_Collection) error {
-	return s.Struct.SetPtr(8, v.Struct.ToPtr())
-}
-
-// NewCollection sets the collection field to a newly
-// allocated Film_Collection struct, preferring placement in s's segment.
-func (s Film) NewCollection() (Film_Collection, error) {
-	ss, err := NewFilm_Collection(s.Struct.Segment())
-	if err != nil {
-		return Film_Collection{}, err
-	}
-	err = s.Struct.SetPtr(8, ss.Struct.ToPtr())
-	return ss, err
-}
-
-func (s Film) Cast() (Film_Character_List, error) {
-	p, err := s.Struct.Ptr(9)
-	return Film_Character_List{List: p.List()}, err
-}
-
-func (s Film) HasCast() bool {
-	p, err := s.Struct.Ptr(9)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) SetCast(v Film_Character_List) error {
-	return s.Struct.SetPtr(9, v.List.ToPtr())
-}
-
-// NewCast sets the cast field to a newly
-// allocated Film_Character_List, preferring placement in s's segment.
-func (s Film) NewCast(n int32) (Film_Character_List, error) {
-	l, err := NewFilm_Character_List(s.Struct.Segment(), n)
-	if err != nil {
-		return Film_Character_List{}, err
-	}
-	err = s.Struct.SetPtr(9, l.List.ToPtr())
-	return l, err
-}
-
-func (s Film) Crew() (Film_CrewMember_List, error) {
-	p, err := s.Struct.Ptr(10)
-	return Film_CrewMember_List{List: p.List()}, err
-}
-
-func (s Film) HasCrew() bool {
-	p, err := s.Struct.Ptr(10)
-	return p.IsValid() || err != nil
-}
-
-func (s Film) SetCrew(v Film_CrewMember_List) error {
-	return s.Struct.SetPtr(10, v.List.ToPtr())
-}
-
-// NewCrew sets the crew field to a newly
-// allocated Film_CrewMember_List, preferring placement in s's segment.
-func (s Film) NewCrew(n int32) (Film_CrewMember_List, error) {
-	l, err := NewFilm_CrewMember_List(s.Struct.Segment(), n)
-	if err != nil {
-		return Film_CrewMember_List{}, err
-	}
-	err = s.Struct.SetPtr(10, l.List.ToPtr())
-	return l, err
-}
-
-// Film_List is a list of Film.
-type Film_List struct{ capnp.List }
-
-// NewFilm creates a new list of Film.
-func NewFilm_List(s *capnp.Segment, sz int32) (Film_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 32, PointerCount: 11}, sz)
-	return Film_List{l}, err
-}
-
-func (s Film_List) At(i int) Film { return Film{s.List.Struct(i)} }
-
-func (s Film_List) Set(i int, v Film) error { return s.List.SetStruct(i, v.Struct) }
-
-func (s Film_List) String() string {
-	str, _ := text.MarshalList(0x8662baafda730202, s.List)
-	return str
-}
-
-// Film_Promise is a wrapper for a Film promised by a client call.
-type Film_Promise struct{ *capnp.Pipeline }
-
-func (p Film_Promise) Struct() (Film, error) {
-	s, err := p.Pipeline.Struct()
-	return Film{s}, err
-}
-
-func (p Film_Promise) ReleaseDate() Film_Date_Promise {
-	return Film_Date_Promise{Pipeline: p.Pipeline.GetPipeline(2)}
-}
-
-func (p Film_Promise) Collection() Film_Collection_Promise {
-	return Film_Collection_Promise{Pipeline: p.Pipeline.GetPipeline(8)}
-}
-
-type Film_Date struct{ capnp.Struct }
-
-// Film_Date_TypeID is the unique identifier for the type Film_Date.
-const Film_Date_TypeID = 0xc1264952b8db1201
-
-func NewFilm_Date(s *capnp.Segment) (Film_Date, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0})
-	return Film_Date{st}, err
-}
-
-func NewRootFilm_Date(s *capnp.Segment) (Film_Date, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0})
-	return Film_Date{st}, err
-}
-
-func ReadRootFilm_Date(msg *capnp.Message) (Film_Date, error) {
-	root, err := msg.RootPtr()
-	return Film_Date{root.Struct()}, err
-}
-
-func (s Film_Date) String() string {
-	str, _ := text.Marshal(0xc1264952b8db1201, s.Struct)
-	return str
-}
-
-func (s Film_Date) Year() int16 {
-	return int16(s.Struct.Uint16(0))
-}
-
-func (s Film_Date) SetYear(v int16) {
-	s.Struct.SetUint16(0, uint16(v))
-}
-
-func (s Film_Date) Month() uint8 {
-	return s.Struct.Uint8(2)
-}
-
-func (s Film_Date) SetMonth(v uint8) {
-	s.Struct.SetUint8(2, v)
-}
-
-func (s Film_Date) Day() uint8 {
-	return s.Struct.Uint8(3)
-}
-
-func (s Film_Date) SetDay(v uint8) {
-	s.Struct.SetUint8(3, v)
-}
-
-// Film_Date_List is a list of Film_Date.
-type Film_Date_List struct{ capnp.List }
-
-// NewFilm_Date creates a new list of Film_Date.
-func NewFilm_Date_List(s *capnp.Segment, sz int32) (Film_Date_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}, sz)
-	return Film_Date_List{l}, err
-}
-
-func (s Film_Date_List) At(i int) Film_Date { return Film_Date{s.List.Struct(i)} }
-
-func (s Film_Date_List) Set(i int, v Film_Date) error { return s.List.SetStruct(i, v.Struct) }
-
-func (s Film_Date_List) String() string {
-	str, _ := text.MarshalList(0xc1264952b8db1201, s.List)
-	return str
-}
-
-// Film_Date_Promise is a wrapper for a Film_Date promised by a client call.
-type Film_Date_Promise struct{ *capnp.Pipeline }
-
-func (p Film_Date_Promise) Struct() (Film_Date, error) {
-	s, err := p.Pipeline.Struct()
-	return Film_Date{s}, err
-}
-
-type Film_Status uint16
-
-// Film_Status_TypeID is the unique identifier for the type Film_Status.
-const Film_Status_TypeID = 0xbacdba448901b941
-
-// Values of Film_Status.
-const (
-	Film_Status_rumored        Film_Status = 0
-	Film_Status_planned        Film_Status = 1
-	Film_Status_inProduction   Film_Status = 2
-	Film_Status_postProduction Film_Status = 3
-	Film_Status_released       Film_Status = 4
-	Film_Status_cancelled      Film_Status = 5
-)
-
-// String returns the enum's constant name.
-func (c Film_Status) String() string {
-	switch c {
-	case Film_Status_rumored:
-		return "Rumored"
-	case Film_Status_planned:
-		return "Planned"
-	case Film_Status_inProduction:
-		return "In Production"
-	case Film_Status_postProduction:
-		return "Post Production"
-	case Film_Status_released:
-		return "Released"
-	case Film_Status_cancelled:
-		return "Cancelled"
-
-	default:
-		return ""
-	}
-}
-
-// Film_StatusFromString returns the enum value with a name,
-// or the zero value if there's no such value.
-func Film_StatusFromString(c string) Film_Status {
-	switch c {
-	case "Rumored":
-		return Film_Status_rumored
-	case "Planned":
-		return Film_Status_planned
-	case "In Production":
-		return Film_Status_inProduction
-	case "Post Production":
-		return Film_Status_postProduction
-	case "Released":
-		return Film_Status_released
-	case "Cancelled":
-		return Film_Status_cancelled
-
-	default:
-		return 0
-	}
-}
-
-type Film_Status_List struct{ capnp.List }
-
-func NewFilm_Status_List(s *capnp.Segment, sz int32) (Film_Status_List, error) {
-	l, err := capnp.NewUInt16List(s, sz)
-	return Film_Status_List{l.List}, err
-}
-
-func (l Film_Status_List) At(i int) Film_Status {
-	ul := capnp.UInt16List{List: l.List}
-	return Film_Status(ul.At(i))
-}
-
-func (l Film_Status_List) Set(i int, v Film_Status) {
-	ul := capnp.UInt16List{List: l.List}
-	ul.Set(i, uint16(v))
-}
-
-type Film_Collection struct{ capnp.Struct }
-
-// Film_Collection_TypeID is the unique identifier for the type Film_Collection.
-const Film_Collection_TypeID = 0xd4e4ef9e83a4bc53
-
-func NewFilm_Collection(s *capnp.Segment) (Film_Collection, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_Collection{st}, err
-}
-
-func NewRootFilm_Collection(s *capnp.Segment) (Film_Collection, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_Collection{st}, err
-}
-
-func ReadRootFilm_Collection(msg *capnp.Message) (Film_Collection, error) {
-	root, err := msg.RootPtr()
-	return Film_Collection{root.Struct()}, err
-}
-
-func (s Film_Collection) String() string {
-	str, _ := text.Marshal(0xd4e4ef9e83a4bc53, s.Struct)
-	return str
-}
-
-func (s Film_Collection) Name() (string, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.Text(), err
-}
-
-func (s Film_Collection) HasName() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Collection) NameBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.TextBytes(), err
-}
-
-func (s Film_Collection) SetName(v string) error {
-	return s.Struct.SetText(0, v)
-}
-
-func (s Film_Collection) Parts() (Film_Collection_CollectionPart_List, error) {
-	p, err := s.Struct.Ptr(1)
-	return Film_Collection_CollectionPart_List{List: p.List()}, err
-}
-
-func (s Film_Collection) HasParts() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Collection) SetParts(v Film_Collection_CollectionPart_List) error {
-	return s.Struct.SetPtr(1, v.List.ToPtr())
-}
-
-// NewParts sets the parts field to a newly
-// allocated Film_Collection_CollectionPart_List, preferring placement in s's segment.
-func (s Film_Collection) NewParts(n int32) (Film_Collection_CollectionPart_List, error) {
-	l, err := NewFilm_Collection_CollectionPart_List(s.Struct.Segment(), n)
-	if err != nil {
-		return Film_Collection_CollectionPart_List{}, err
-	}
-	err = s.Struct.SetPtr(1, l.List.ToPtr())
-	return l, err
-}
-
-// Film_Collection_List is a list of Film_Collection.
-type Film_Collection_List struct{ capnp.List }
-
-// NewFilm_Collection creates a new list of Film_Collection.
-func NewFilm_Collection_List(s *capnp.Segment, sz int32) (Film_Collection_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz)
-	return Film_Collection_List{l}, err
-}
-
-func (s Film_Collection_List) At(i int) Film_Collection { return Film_Collection{s.List.Struct(i)} }
-
-func (s Film_Collection_List) Set(i int, v Film_Collection) error {
-	return s.List.SetStruct(i, v.Struct)
-}
-
-func (s Film_Collection_List) String() string {
-	str, _ := text.MarshalList(0xd4e4ef9e83a4bc53, s.List)
-	return str
-}
-
-// Film_Collection_Promise is a wrapper for a Film_Collection promised by a client call.
-type Film_Collection_Promise struct{ *capnp.Pipeline }
-
-func (p Film_Collection_Promise) Struct() (Film_Collection, error) {
-	s, err := p.Pipeline.Struct()
-	return Film_Collection{s}, err
-}
-
-type Film_Collection_CollectionPart struct{ capnp.Struct }
-
-// Film_Collection_CollectionPart_TypeID is the unique identifier for the type Film_Collection_CollectionPart.
-const Film_Collection_CollectionPart_TypeID = 0xa0d6cbb1ccac3e25
-
-func NewFilm_Collection_CollectionPart(s *capnp.Segment) (Film_Collection_CollectionPart, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3})
-	return Film_Collection_CollectionPart{st}, err
-}
-
-func NewRootFilm_Collection_CollectionPart(s *capnp.Segment) (Film_Collection_CollectionPart, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3})
-	return Film_Collection_CollectionPart{st}, err
-}
-
-func ReadRootFilm_Collection_CollectionPart(msg *capnp.Message) (Film_Collection_CollectionPart, error) {
-	root, err := msg.RootPtr()
-	return Film_Collection_CollectionPart{root.Struct()}, err
-}
-
-func (s Film_Collection_CollectionPart) String() string {
-	str, _ := text.Marshal(0xa0d6cbb1ccac3e25, s.Struct)
-	return str
-}
-
-func (s Film_Collection_CollectionPart) Id() uint64 {
-	return s.Struct.Uint64(0)
-}
-
-func (s Film_Collection_CollectionPart) SetId(v uint64) {
-	s.Struct.SetUint64(0, v)
-}
-
-func (s Film_Collection_CollectionPart) Title() (string, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.Text(), err
-}
-
-func (s Film_Collection_CollectionPart) HasTitle() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Collection_CollectionPart) TitleBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.TextBytes(), err
-}
-
-func (s Film_Collection_CollectionPart) SetTitle(v string) error {
-	return s.Struct.SetText(0, v)
-}
-
-func (s Film_Collection_CollectionPart) ReleaseDate() (Film_Date, error) {
-	p, err := s.Struct.Ptr(1)
-	return Film_Date{Struct: p.Struct()}, err
-}
-
-func (s Film_Collection_CollectionPart) HasReleaseDate() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Collection_CollectionPart) SetReleaseDate(v Film_Date) error {
-	return s.Struct.SetPtr(1, v.Struct.ToPtr())
-}
-
-// NewReleaseDate sets the releaseDate field to a newly
-// allocated Film_Date struct, preferring placement in s's segment.
-func (s Film_Collection_CollectionPart) NewReleaseDate() (Film_Date, error) {
-	ss, err := NewFilm_Date(s.Struct.Segment())
-	if err != nil {
-		return Film_Date{}, err
-	}
-	err = s.Struct.SetPtr(1, ss.Struct.ToPtr())
-	return ss, err
-}
-
-func (s Film_Collection_CollectionPart) PosterPath() (string, error) {
-	p, err := s.Struct.Ptr(2)
-	return p.Text(), err
-}
-
-func (s Film_Collection_CollectionPart) HasPosterPath() bool {
-	p, err := s.Struct.Ptr(2)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Collection_CollectionPart) PosterPathBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(2)
-	return p.TextBytes(), err
-}
-
-func (s Film_Collection_CollectionPart) SetPosterPath(v string) error {
-	return s.Struct.SetText(2, v)
-}
-
-// Film_Collection_CollectionPart_List is a list of Film_Collection_CollectionPart.
-type Film_Collection_CollectionPart_List struct{ capnp.List }
-
-// NewFilm_Collection_CollectionPart creates a new list of Film_Collection_CollectionPart.
-func NewFilm_Collection_CollectionPart_List(s *capnp.Segment, sz int32) (Film_Collection_CollectionPart_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3}, sz)
-	return Film_Collection_CollectionPart_List{l}, err
-}
-
-func (s Film_Collection_CollectionPart_List) At(i int) Film_Collection_CollectionPart {
-	return Film_Collection_CollectionPart{s.List.Struct(i)}
-}
-
-func (s Film_Collection_CollectionPart_List) Set(i int, v Film_Collection_CollectionPart) error {
-	return s.List.SetStruct(i, v.Struct)
-}
-
-func (s Film_Collection_CollectionPart_List) String() string {
-	str, _ := text.MarshalList(0xa0d6cbb1ccac3e25, s.List)
-	return str
-}
-
-// Film_Collection_CollectionPart_Promise is a wrapper for a Film_Collection_CollectionPart promised by a client call.
-type Film_Collection_CollectionPart_Promise struct{ *capnp.Pipeline }
-
-func (p Film_Collection_CollectionPart_Promise) Struct() (Film_Collection_CollectionPart, error) {
-	s, err := p.Pipeline.Struct()
-	return Film_Collection_CollectionPart{s}, err
-}
-
-func (p Film_Collection_CollectionPart_Promise) ReleaseDate() Film_Date_Promise {
-	return Film_Date_Promise{Pipeline: p.Pipeline.GetPipeline(1)}
-}
-
-type Film_Character struct{ capnp.Struct }
-
-// Film_Character_TypeID is the unique identifier for the type Film_Character.
-const Film_Character_TypeID = 0xfc58a269203af0a8
-
-func NewFilm_Character(s *capnp.Segment) (Film_Character, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_Character{st}, err
-}
-
-func NewRootFilm_Character(s *capnp.Segment) (Film_Character, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_Character{st}, err
-}
-
-func ReadRootFilm_Character(msg *capnp.Message) (Film_Character, error) {
-	root, err := msg.RootPtr()
-	return Film_Character{root.Struct()}, err
-}
-
-func (s Film_Character) String() string {
-	str, _ := text.Marshal(0xfc58a269203af0a8, s.Struct)
-	return str
-}
-
-func (s Film_Character) Person() (Person, error) {
-	p, err := s.Struct.Ptr(0)
-	return Person{Struct: p.Struct()}, err
-}
-
-func (s Film_Character) HasPerson() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Character) SetPerson(v Person) error {
-	return s.Struct.SetPtr(0, v.Struct.ToPtr())
-}
-
-// NewPerson sets the person field to a newly
-// allocated Person struct, preferring placement in s's segment.
-func (s Film_Character) NewPerson() (Person, error) {
-	ss, err := NewPerson(s.Struct.Segment())
-	if err != nil {
-		return Person{}, err
-	}
-	err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
-	return ss, err
-}
-
-func (s Film_Character) Name() (string, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.Text(), err
-}
-
-func (s Film_Character) HasName() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_Character) NameBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.TextBytes(), err
-}
-
-func (s Film_Character) SetName(v string) error {
-	return s.Struct.SetText(1, v)
-}
-
-// Film_Character_List is a list of Film_Character.
-type Film_Character_List struct{ capnp.List }
-
-// NewFilm_Character creates a new list of Film_Character.
-func NewFilm_Character_List(s *capnp.Segment, sz int32) (Film_Character_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz)
-	return Film_Character_List{l}, err
-}
-
-func (s Film_Character_List) At(i int) Film_Character { return Film_Character{s.List.Struct(i)} }
-
-func (s Film_Character_List) Set(i int, v Film_Character) error { return s.List.SetStruct(i, v.Struct) }
-
-func (s Film_Character_List) String() string {
-	str, _ := text.MarshalList(0xfc58a269203af0a8, s.List)
-	return str
-}
-
-// Film_Character_Promise is a wrapper for a Film_Character promised by a client call.
-type Film_Character_Promise struct{ *capnp.Pipeline }
-
-func (p Film_Character_Promise) Struct() (Film_Character, error) {
-	s, err := p.Pipeline.Struct()
-	return Film_Character{s}, err
-}
-
-func (p Film_Character_Promise) Person() Person_Promise {
-	return Person_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
-}
-
-type Film_CrewMember struct{ capnp.Struct }
-
-// Film_CrewMember_TypeID is the unique identifier for the type Film_CrewMember.
-const Film_CrewMember_TypeID = 0x8afd64c84282f606
-
-func NewFilm_CrewMember(s *capnp.Segment) (Film_CrewMember, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_CrewMember{st}, err
-}
-
-func NewRootFilm_CrewMember(s *capnp.Segment) (Film_CrewMember, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
-	return Film_CrewMember{st}, err
-}
-
-func ReadRootFilm_CrewMember(msg *capnp.Message) (Film_CrewMember, error) {
-	root, err := msg.RootPtr()
-	return Film_CrewMember{root.Struct()}, err
-}
-
-func (s Film_CrewMember) String() string {
-	str, _ := text.Marshal(0x8afd64c84282f606, s.Struct)
-	return str
-}
-
-func (s Film_CrewMember) Person() (Person, error) {
-	p, err := s.Struct.Ptr(0)
-	return Person{Struct: p.Struct()}, err
-}
-
-func (s Film_CrewMember) HasPerson() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_CrewMember) SetPerson(v Person) error {
-	return s.Struct.SetPtr(0, v.Struct.ToPtr())
-}
-
-// NewPerson sets the person field to a newly
-// allocated Person struct, preferring placement in s's segment.
-func (s Film_CrewMember) NewPerson() (Person, error) {
-	ss, err := NewPerson(s.Struct.Segment())
-	if err != nil {
-		return Person{}, err
-	}
-	err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
-	return ss, err
-}
-
-func (s Film_CrewMember) Job() (string, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.Text(), err
-}
-
-func (s Film_CrewMember) HasJob() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Film_CrewMember) JobBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.TextBytes(), err
-}
-
-func (s Film_CrewMember) SetJob(v string) error {
-	return s.Struct.SetText(1, v)
-}
-
-// Film_CrewMember_List is a list of Film_CrewMember.
-type Film_CrewMember_List struct{ capnp.List }
-
-// NewFilm_CrewMember creates a new list of Film_CrewMember.
-func NewFilm_CrewMember_List(s *capnp.Segment, sz int32) (Film_CrewMember_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz)
-	return Film_CrewMember_List{l}, err
-}
-
-func (s Film_CrewMember_List) At(i int) Film_CrewMember { return Film_CrewMember{s.List.Struct(i)} }
-
-func (s Film_CrewMember_List) Set(i int, v Film_CrewMember) error {
-	return s.List.SetStruct(i, v.Struct)
-}
-
-func (s Film_CrewMember_List) String() string {
-	str, _ := text.MarshalList(0x8afd64c84282f606, s.List)
-	return str
-}
-
-// Film_CrewMember_Promise is a wrapper for a Film_CrewMember promised by a client call.
-type Film_CrewMember_Promise struct{ *capnp.Pipeline }
-
-func (p Film_CrewMember_Promise) Struct() (Film_CrewMember, error) {
-	s, err := p.Pipeline.Struct()
-	return Film_CrewMember{s}, err
-}
-
-func (p Film_CrewMember_Promise) Person() Person_Promise {
-	return Person_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
-}
-
-type Person struct{ capnp.Struct }
-
-// Person_TypeID is the unique identifier for the type Person.
-const Person_TypeID = 0xbe38be3daa02cbbb
-
-func NewPerson(s *capnp.Segment) (Person, error) {
-	st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 2})
-	return Person{st}, err
-}
-
-func NewRootPerson(s *capnp.Segment) (Person, error) {
-	st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 2})
-	return Person{st}, err
-}
-
-func ReadRootPerson(msg *capnp.Message) (Person, error) {
-	root, err := msg.RootPtr()
-	return Person{root.Struct()}, err
-}
-
-func (s Person) String() string {
-	str, _ := text.Marshal(0xbe38be3daa02cbbb, s.Struct)
-	return str
-}
-
-func (s Person) Id() uint64 {
-	return s.Struct.Uint64(0)
-}
-
-func (s Person) SetId(v uint64) {
-	s.Struct.SetUint64(0, v)
-}
-
-func (s Person) Name() (string, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.Text(), err
-}
-
-func (s Person) HasName() bool {
-	p, err := s.Struct.Ptr(0)
-	return p.IsValid() || err != nil
-}
-
-func (s Person) NameBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(0)
-	return p.TextBytes(), err
-}
-
-func (s Person) SetName(v string) error {
-	return s.Struct.SetText(0, v)
-}
-
-func (s Person) PhotoPath() (string, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.Text(), err
-}
-
-func (s Person) HasPhotoPath() bool {
-	p, err := s.Struct.Ptr(1)
-	return p.IsValid() || err != nil
-}
-
-func (s Person) PhotoPathBytes() ([]byte, error) {
-	p, err := s.Struct.Ptr(1)
-	return p.TextBytes(), err
-}
-
-func (s Person) SetPhotoPath(v string) error {
-	return s.Struct.SetText(1, v)
-}
-
-// Person_List is a list of Person.
-type Person_List struct{ capnp.List }
-
-// NewPerson creates a new list of Person.
-func NewPerson_List(s *capnp.Segment, sz int32) (Person_List, error) {
-	l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 2}, sz)
-	return Person_List{l}, err
-}
-
-func (s Person_List) At(i int) Person { return Person{s.List.Struct(i)} }
-
-func (s Person_List) Set(i int, v Person) error { return s.List.SetStruct(i, v.Struct) }
-
-func (s Person_List) String() string {
-	str, _ := text.MarshalList(0xbe38be3daa02cbbb, s.List)
-	return str
-}
-
-// Person_Promise is a wrapper for a Person promised by a client call.
-type Person_Promise struct{ *capnp.Pipeline }
-
-func (p Person_Promise) Struct() (Person, error) {
-	s, err := p.Pipeline.Struct()
-	return Person{s}, err
-}
-
-const schema_cd7129bab3129d29 = "x\xda\x8c\x96\xef\x8bSW\x1e\xc6\x9f\xe7\x9c$w\x12" +
-	"\xe3$\xd7{\x97\xdd\x11%\xee\xa2\x8b\x0e\xab\x8c\xa3." +
-	"2\xb0;\xce\x8f]vD!7\x11V\x86\x15\xbc\x93" +
-	"\\\x9ch\x92\x1bon\x1c\x94]\x86ua\xa1\xfe\x03" +
-	"\x85\x82\xa5-\x15\xdaR\x90\xfex\xd1N\x8b\xc5B\xa9" +
-	"T\x85\x0aZ\x8a}'-\xadP\xd1B-\x15,\xb7" +
-	"\x9c\x9b\x1f7S\xa7\xea\xbb\xc3'\xdfs\xcf\xf3=\xe7" +
-	"y\xce\xc9\xc8\x9f\xe5\x1e\xb1=\xbe\x18\x03\xac\x9d\xf1D" +
-	" D\xf3\xe6\xf9\xa5\xb9\xff\xc3J3\x16l9\xbb\xe6" +
-	"\xad\xa5-\xc7\xaf\"\xbeJ\x03\x8cM\xe2\x8c\xb1U\xfc" +
-	"\x13\xd8q\\| \xc1 \xf1\xc3\xe9\xc9K\xe5\x9f\xce" +
-	"@\xd7\x19M\x8d\x0bU|6q\xcbx5\xa1F\xe7" +
-	"\x12\x0b`\xb0\xe9\xaf\xaf_y\xe3\xf2g/\xc0ZG" +
-	"\x06\xc5\xf7_\xfe\xdf\xf3w\xbf\xbc\x8e\xb8\xd4\x80\x1d\xd4" +
-	"fi\xfcFS\xd5\xba\xf65\x18L\xbc\xcbg\xa6\x97" +
-	"\xae.A\xd7E\xf4e\xd0\xb8\xa3}h\xdc\x0f\x0b\xbf" +
-	"\xd3\x9e\x05\x83\xf7.\x8b\xd7\xfera\xf7\x05%\x98}" +
-	"\x82C\x0d[\x93\xcf\x19\xbb\x92j\xb4=y\x1e\x0c\xb8" +
-	"\xe6\x8bw\x0a3\x7f\xbc\x08Kg\x9f\xe0\x98\xaa\xb8\x9a" +
-	"|\xd3\xb8\x11\xd6^\x0bk{\x0aW\xe8\xad\x92\xbae" +
-	"\xb4R\xbf\x05\x8c\xff\xa6To\xaf\xdc\x1b\xdbPy\xe9" +
-	"\xe0\xc3\x95j\xef\xa4n\x1a\x0fRjt?\xb5\x80\xdd" +
-	"\x81]k5\x9dm\x0d\x8f\xae\xef\x8e\xfd\xbdR\xad\x01" +
-	"\x96\xc9>m\xfa\xef\x87\xfb\xda_?\xd6\xa7dh\xb6" +
-	"o\xa9\xa1B\xdf\xfe\x0f\xcdf\xa6m\xdf\x19/\xfa\xb6" +
-	"\xdfj\x06Sn\xb5\xea\x94\xfc\x0a\xa4[\x0f\xa6\xe6m" +
-	"\xcf.\xf9\x0e\xe8\x05S\x9e\xb3\xb0\xdf\xa9\xcdA:\x9e" +
-	"5-c@\x8c\xaay\xae\x05\x8a\x97(Y\xbcNA" +
-	"\xd2\xa4\xc2\xd78\x0a\x14\xaf(\xfc9\x05uA\x93\x02" +
-	"0np\x0c(~\xaa\xf8\xb7\x8aKaR\x02\xc6m" +
-	"\xce\x01\xc5o\x14\xff^\xf1\x984\x19SGE\x0f(" +
-	"\xdeS\xfc\xa1\xe2\xf1\x98\xc98`<\xe0^\xa0\xf8\xa3" +
-	"\xe21!\xa8'\xe2&\x13\x80A1\x09\x14\x1f*>" +
-	"\xa0\xb8\x163\xa9v0\xaexAH\x16\xd3\x0a\x0f\xe4" +
-	"M\x0e\x00F2,\x8f)\x9eU<)M&\x01c" +
-	"\xb5\x18\x06\x8a\x03\x8a\x9b\x8a\xa7\x84\xc9\x94\xb2\x98(\x00" +
-	"\xc5\xac\xe2\xeb\x14_\x956\xb9\x0a0\x86\x84j\xcbT" +
-	"|\x83\xe2\xe9\x84\xc94`\xac\x17\xb3@q\x9d\xe2\x9b" +
-	"\x15_\xad\x99\\\x1d\xe6\xe1(P\xdc\xa8\xf8\x88\xe2\x83" +
-	"\x03&\x07\x95\xed\xc2\xfa?)\xbe[\xf1L\xd2d\x06" +
-	"0v\x85zF\x14\xdf\xa7x6e2\x0b\x183!" +
-	"\x9fV\xfc\xb0\x10\x94\x952\x93\x10L\x829\xbf\xe2W" +
-	"\x1d\xa6!\x98\x06\xc7\x8f8u\xcfir\x10\xccK\x86" +
-	"t\x10\x0c<\xa7\xea\xd8Mg\x1a\x9a\xed;\xccFN" +
-	"\x02\x99\x05\x03\xd7\xab\x1c\xa9\xd4\xed*r\x07\xfa\xbf\x16" +
-	"\xb8'\x1c\xefD\xc5Y\x00\xd0e\x8b\xbe}\xa4Z\xa9" +
-	"\xf7j\x16\xbdV\xdd\xaf\xd4\x1cj\x10\xd4\xc0\xc5Js" +
-	"\xa2\xdc\xaa\xfa$\x04\x09fj\xb6w\x8c)\x08\xa6\xc0" +
-	"\xe0\x84\xeb;Sn\xab\x0e\xfa\xdd\x06\xc6\x9b\xa1!\x99" +
-	"\x89,\x0d2\x03\x06\x0d\xb7\xe9;^\xde\x86\xf4\xe7{" +
-	"\x92\xe6\xec\xd2\xb1\xb2\xe76\x90\xc9\xdb}\xb8\xd4gg" +
-	"f\xa3@\xb4\x1b\xcc\x94\xec\xa6\xdf\xdd\x94l\x94\x10P" +
-	"\xc1L\xc9s\x16\xa2_{\x91i\xff\xda\x8b\xa3\xe8\xc6" +
-	"q['\"\xda\x9c\xe3\xe5Ik\xa0\x1b\x12}\xcb\x18" +
-	"`m\x94\xb4F\x04\xf5ND\xf4\xad\x7f\x00\xac\xcd\x92" +
-	"\xd6N\xc1\xf1\x86\xe35C\x85\xbd[\xa9\xadP;\xea" +
-	"\xce\xf5\x9a\xe9\xae\x18\x8bV\xec\xb4\xe7\xd6\xfb\x86y[" +
-	"z\xbe\x12\x90\xed\x09\xb0\xd7\x02\xd6\xbf$\xad\xf9^D" +
-	"ug\x14\xb0\x0eKZ\xd5(\x9fze\x0e\xb0\xe6%" +
-	"-?\x0a\xa7~|\x16\xb0\x1a\x92\xd6\xbf\x1fc\xb1'" +
-	"\x9ai\xc5c{t\x13\xdb\xf7\x10\x94\xfe\xdf\x85\x92&" +
-	"&\xf5\x89\x1c\xa9\x1f\x9a\xd4\x0f\xe5(\xf4\x93G\xf5\xff" +
-	"\xe4(\xf5\xb3\xa7\xf4\x17s\x8c\xe9\x17\xf7\xea\x1f\xe5\x18" +
-	"\xd7\xbf*\xe8\xb7s\x8b^\xab\xe6zN\xd9\x8aQ\x04" +
-	"\x1f\xdf\xfdd\xe3\xd0\xdb\xfe9X1\xc1\x89\xac\xf2=" +
-	"tN.\x16\xda5\xc0b\xa3j\xd7\xebO\xa8\xce\xb7" +
-	"k\x80\xa0R\xcf{n\xb9UBFm\xf3\x0a\x93\xcc" +
-	"\xce$/\x98\xa9o\x08k\x91\x0b\x8f\x04\x08\xdbW\x08" +
-	"\xe3\xad\xd2\x13\xa6\x9f\x0e\xf2n\xd3W\x1f`\xb9\xd5\x99" +
-	"\x8f\xee\xfe\x96\x01<f\xee\xde\xa0\xd0\xabcP\xb2\xeb" +
-	"%\xa7Zu\xc0\xf2c\xe6\x14\x82\xa9\xa8\x0eX\xfe\xd0" +
-	"\xe4\x1d\xaf)\xdd\xba:\x8ft\xcfO\x7fS~\xda#" +
-	"i\xed\x8b\xfc43\x0cX\xd3\x92V\xbe\xcfO\xfb\x0b" +
-	"\x80\xb5O\xd2:\xb8\xcc:\x99\xba]\x8b\x9c\xd3\x98w" +
-	"}7o\xfb\xe0\xa3\xc6\xe8=v\xb9m\xea\x99\xfa\x85" +
-	"\x8c\xe1H\x86N\xd1\xd11\xda\xafCvt\xa8\xb0\xfd" +
-	"C\xd2: \x989\xe9\xd8\x1e%\x04%\x98\xab\xb9u" +
-	"\x7f\x9e\x09\x08&@\xadl\x9f\xec\x8eW\x0ax;c" +
-	"Z\xfb\xf8\xfa\xfe\x99\xe8<\x15\xbd\x9c\xe3*\x82\x9e\xdf" +
-	"\x9f\xff\xe1\x95\xf2?\xda\xc9\xff\xb4X\xbe\x1f\xb9\x86\xed" +
-	"\xf9\xcd\xe8\xe2\xe9\xad\xf2\xeb\x17O\xfb\x9d\x96Ow\xef" +
-	"\x0c?\xc5\xbd\xb3L\xd0\xcf\x01\x00\x00\xff\xff\xd0*V" +
-	"\x11"
-
-func init() {
-	schemas.Register(schema_cd7129bab3129d29,
-		0x8662baafda730202,
-		0x8afd64c84282f606,
-		0xa0d6cbb1ccac3e25,
-		0xbacdba448901b941,
-		0xbe38be3daa02cbbb,
-		0xc1264952b8db1201,
-		0xd4e4ef9e83a4bc53,
-		0xfc58a269203af0a8)
-}




diff --git a/protocol/film.go b/protocol/film.go
deleted file mode 100644
index 151dad703b033cc713a167040cb893268e7dd15b..0000000000000000000000000000000000000000
--- a/protocol/film.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package protocol
-
-import (
-	"notabug.org/apiote/amuse/tmdb"
-	"notabug.org/apiote/amuse/utils"
-
-	"zombiezen.com/go/capnproto2"
-
-	"io"
-	"time"
-	"bytes"
-)
-
-const (
-	posterWidth   = "w154"
-	backdropWidth = "w1280"
-)
-
-
-func Recode(tmdbFilm *tmdb.Film, tmdbCollection *tmdb.Collection) (io.Writer, error) {
-	var err error = nil
-
-	msg, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
-	film, err2 := NewRootFilm(seg)
-	err = utils.Or(err, err2)
-
-	err = utils.Or(film.SetBackdropPath("https://image.tmdb.org/t/p/"+backdropWidth+tmdbFilm.Backdrop_path), err)
-
-	collection, err2 := film.NewCollection()
-	err = utils.Or(err, err2)
-	err = utils.Or(collection.SetName(tmdbCollection.Name), err)
-	parts, err2 := collection.NewParts(int32(len(tmdbCollection.Parts)))
-	err = utils.Or(err, err2)
-	for i, tmdbPart := range tmdbCollection.Parts {
-		part := parts.At(i)
-		part.SetId(uint64(tmdbPart.Id))
-		err = utils.Or(part.SetTitle(tmdbPart.Title), err)
-		err = utils.Or(part.SetPosterPath("https://image.tmdb.org/t/p/"+posterWidth+tmdbPart.Poster_path), err)
-		releaseDate, err2 := part.NewReleaseDate()
-		err = utils.Or(err, err2)
-		releaseDate.SetYear(int16(tmdbFilm.Release_date.Year()))
-		releaseDate.SetMonth(uint8(tmdbFilm.Release_date.Month()))
-		releaseDate.SetDay(uint8(tmdbFilm.Release_date.Day()))
-		err = utils.Or(part.SetReleaseDate(releaseDate), err)
-		//parts.Set(i, part)
-	}
-
-	genres, err2 := film.NewGenres(int32(len(tmdbFilm.Genres)))
-	err = utils.Or(err, err2)
-	for i, tmdbGenre := range tmdbFilm.Genres {
-		genres.Set(i, tmdbGenre.Name)
-	}
-
-	err = utils.Or(film.SetOriginalTitle(tmdbFilm.Original_title), err)
-	err = utils.Or(film.SetOverview(tmdbFilm.Overview), err)
-	err = utils.Or(film.SetPosterPath("https://image.tmdb.org/t/p/"+posterWidth+tmdbFilm.Poster_path), err)
-
-	releaseDate, err2 := film.NewReleaseDate()
-	err = utils.Or(err, err2)
-	date, err2 := time.Parse("2006-01-02", tmdbFilm.Release_date_str)
-	err = utils.Or(err, err2)
-	releaseDate.SetYear(int16(date.Year()))
-	releaseDate.SetMonth(uint8(date.Month()))
-	releaseDate.SetDay(uint8(date.Day()))
-	err = utils.Or(film.SetReleaseDate(releaseDate), err)
-
-	film.SetRuntime(uint16(tmdbFilm.Runtime))
-	film.SetStatus(Film_StatusFromString(tmdbFilm.Status))
-	err = utils.Or(film.SetTagline(tmdbFilm.Tagline), err)
-	err = utils.Or(film.SetTitle(tmdbFilm.Title), err)
-	film.SetMark(tmdbFilm.Vote_average)
-	film.SetVoteCount(uint64(tmdbFilm.Vote_count))
-
-	cast, err2 := film.NewCast(int32(len(tmdbFilm.Credits.Cast)))
-	err = utils.Or(err, err2)
-	for i, tmdbCharacter := range tmdbFilm.Credits.Cast {
-		character := cast.At(i)
-		err = utils.Or(character.SetName(tmdbCharacter.Character), err)
-		person, err2 := character.NewPerson()
-		err = utils.Or(err, err2)
-		person.SetId(uint64(tmdbCharacter.Id))
-		err = utils.Or(person.SetName(tmdbCharacter.Name), err)
-		err = utils.Or(person.SetPhotoPath("https://image.tmdb.org/t/p/"+posterWidth+tmdbCharacter.Profile_path), err)
-	}
-
-	crew, err2 := film.NewCrew(int32(len(tmdbFilm.Credits.Crew)))
-	err = utils.Or(err, err2)
-	for i, tmdbCrewMember := range tmdbFilm.Credits.Crew {
-		crewMember := crew.At(i)
-		err = utils.Or(crewMember.SetJob(tmdbCrewMember.Job), err)
-		person, err2 := crewMember.NewPerson()
-		err = utils.Or(err, err2)
-		person.SetId(uint64(tmdbCrewMember.Id))
-		err = utils.Or(person.SetName(tmdbCrewMember.Name), err)
-		err = utils.Or(person.SetPhotoPath("https://image.tmdb.org/t/p/"+posterWidth+tmdbCrewMember.Profile_path), err)
-	}
-	b := bytes.NewBuffer([]byte{})
-	err = utils.Or(capnp.NewEncoder(b).Encode(msg), err)
-	return b, err
-}




diff --git a/protocol/makefile b/protocol/makefile
deleted file mode 100644
index 84ebea804fd2a6c5163cab9fd24d6b3855055cbf..0000000000000000000000000000000000000000
--- a/protocol/makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-amuse.proto.go: amuse.proto
-	capnp compile -I/usr/include/capnp/ -ogo amuse.proto