func CompressWithWhitelist(input []byte, wl ValueWhitelist) (output []byte, err error) {
	return newCompressor(input, wl, true).run()
}
CompressWithWhitelist takes as input a msgpack encoded payload,
and also a whitelist of values that it's OK to compress.  It then compresses
all map keys and values in the given whitelist, and returns a compression,
or an error on error.
package msgpackzip
import (
	"bytes"
	"fmt"
	"sort"
)
type compressor struct {
	input          []byte
	valueWhitelist ValueWhitelist
	collectMapKeys bool
}
func newCompressor(b []byte, wl ValueWhitelist, c bool) *compressor {
	return &compressor{input: b, valueWhitelist: wl, collectMapKeys: c}
}
type ValueWhitelist struct {
	strings     map[string]bool
	binaries    map[string]bool
	allValuesOk bool
}
func NewValueWhitelist() *ValueWhitelist {
	return &ValueWhitelist{
		strings:  make(map[string]bool),
		binaries: make(map[string]bool),
	}
}
func (v *ValueWhitelist) AddString(s string) {
	v.strings[s] = true
}
func (v *ValueWhitelist) AddBinary(b []byte) {
	v.binaries[string(b)] = true
}
func (v *ValueWhitelist) hasString(s string) bool {
	if v.allValuesOk {
		return true
	}
	return v.strings[s]
}
func (v *ValueWhitelist) hasBinary(b []byte) bool {
	if v.allValuesOk {
		return true
	}
	return v.binaries[string(b)]
}