public void fillExport() {
   if (_exportable.empty()) return;
   if (_export == null) {
     _export = _exportable.take();
   } else {
     int request = Math.min(SLOT_STACK_LIMIT, _export.getMaxStackSize()) - _export.stackSize;
     ItemStack taken = _exportable.take(_export, request);
     if (taken != null) _export.stackSize += taken.stackSize;
     else _export = _exportable.take();
   }
 }
 public Inventory clear() {
   _elements.clear();
   _whitelist.clear();
   _exportable.clear();
   _export = null;
   _total = 0;
   return this;
 }
 public void fromNbt(NBTTagCompound tag) {
   clear();
   NBTTagList elements = tag.getTagList("elements", Constants.NBT.TAG_COMPOUND);
   for (int i = 0; i < elements.tagCount(); ++i) {
     NBTTagCompound element = elements.getCompoundTagAt(i);
     Key k = Key.fromNbt(element.getCompoundTag("key"));
     Element e = Element.fromNbt(element.getCompoundTag("element"));
     _elements.put(k, e);
     if (e.whitelisted()) _whitelist.add(k);
   }
   _exportable.fromNbt(tag.getCompoundTag("exportable"));
   if (tag.hasKey("export"))
     _export = ItemHelper.readItemStackFromNBT(tag.getCompoundTag("export"));
   _total = tag.getInteger("total");
 }
 public NBTTagCompound toNbt() {
   NBTTagCompound tag = new NBTTagCompound();
   NBTTagList elements = new NBTTagList();
   for (Map.Entry<Key, Element> e : _elements.entrySet()) {
     NBTTagCompound element = new NBTTagCompound();
     element.setTag("key", e.getKey().toNbt());
     element.setTag("element", e.getValue().toNbt());
     elements.appendTag(element);
   }
   tag.setTag("elements", elements);
   tag.setTag("exportable", _exportable.toNbt());
   if (_export != null)
     tag.setTag("export", ItemHelper.writeItemStackToNBT(_export, new NBTTagCompound()));
   tag.setInteger("total", _total);
   return tag;
 }
 public ItemStack putExportable(ItemStack stack) {
   return _exportable.put(stack);
 }