local contents = {};
local issecure = issecure;
local type = type;
local pairs = pairs;

--Create a local version of this function just so we don't have to worry about changes
local function copyTable(tab)
	local copy = {};
	for k, v in pairs(tab) do
		if ( type(v) == "table" ) then
			copy[k] = copyTable(v);
		else
			copy[k] = v;
		end
	end
	return copy;
end

function SecureCapsuleGet(name)
	if ( not issecure() ) then
		return;
	end

	if ( type(contents[name]) == "table" ) then
		--Segment the users
		return copyTable(contents[name]);
	else
		return contents[name];
	end
end

-------------------------------
--Local functions for retaining.
-------------------------------

--Retains a copy of name
local function retain(name)
	if ( type(_G[name]) == "table" ) then
		contents[name] = copyTable(_G[name]);
	else
		contents[name] = _G[name];
	end
end

--Takes name and removes it from the global environment (note: make sure that nothing else has saved off a copy)
local function take(name)
	contents[name] = _G[name];
	_G[name] = nil;
end


-------------------------------
--Things we actually want to save
-------------------------------

--If storing off Lua functions, be careful that they don't in turn call any other Lua functions that may have been swapped out.

--For store
if ( IsGMClient() ) then
	retain("C_PurchaseAPI");
	retain("HideGMOnly");
else
	take("C_PurchaseAPI");
end
take("CreateForbiddenFrame");
retain("IsGMClient");
retain("IsOnGlueScreen");
retain("math");
retain("pairs");
retain("select");
retain("unpack");
retain("tostring");
retain("tonumber");
retain("LoadURLIndex");
retain("GetContainerNumFreeSlots");
retain("GetCursorPosition");
retain("GetRealmName");
retain("PlaySound");
retain("SetPortraitToTexture");
retain("BACKPACK_CONTAINER");
retain("NUM_BAG_SLOTS");
retain("RAID_CLASS_COLORS");
retain("C_PetJournal");
retain("IsModifiedClick");
retain("GetTime");
retain("UnitAffectingCombat");

--For auth challenge
take("C_AuthChallenge");
retain("IsShiftKeyDown");
retain("GetBindingFromClick");

--For character services
take("C_SharedCharacterServices");

--GlobalStrings
retain("BLIZZARD_STORE");
take("BLIZZARD_STORE_ON_SALE");
take("BLIZZARD_STORE_BUY");
take("BLIZZARD_STORE_BUY_EUR");
take("BLIZZARD_STORE_PLUS_TAX");
take("BLIZZARD_STORE_PRODUCT_INDEX");
take("BLIZZARD_STORE_CANCEL_PURCHASE");
take("BLIZZARD_STORE_FINAL_BUY");
take("BLIZZARD_STORE_FINAL_BUY_EUR");
take("BLIZZARD_STORE_CONFIRMATION_TITLE");
take("BLIZZARD_STORE_CONFIRMATION_INSTRUCTION");
take("BLIZZARD_STORE_FINAL_PRICE_LABEL");
take("BLIZZARD_STORE_PAYMENT_METHOD");
take("BLIZZARD_STORE_PAYMENT_METHOD_EXTRA");
take("BLIZZARD_STORE_LOADING");
take("BLIZZARD_STORE_PLEASE_WAIT");
take("BLIZZARD_STORE_NO_ITEMS");
take("BLIZZARD_STORE_CHECK_BACK_LATER");
take("BLIZZARD_STORE_TRANSACTION_IN_PROGRESS");
take("BLIZZARD_STORE_CONNECTING");
take("BLIZZARD_STORE_VISIT_WEBSITE");
take("BLIZZARD_STORE_VISIT_WEBSITE_WARNING");
take("BLIZZARD_STORE_BAG_FULL");
take("BLIZZARD_STORE_BAG_FULL_DESC");
take("BLIZZARD_STORE_CONFIRMATION_GENERIC");
take("BLIZZARD_STORE_CONFIRMATION_TEST");
take("BLIZZARD_STORE_CONFIRMATION_EUR");
take("BLIZZARD_STORE_CONFIRMATION_SERVICES");
take("BLIZZARD_STORE_CONFIRMATION_SERVICES_TEST");
take("BLIZZARD_STORE_CONFIRMATION_SERVICES_EUR");
take("BLIZZARD_STORE_BROWSE_TEST_CURRENCY");
take("BLIZZARD_STORE_BATTLE_NET_BALANCE");
take("BLIZZARD_STORE_CURRENCY_FORMAT_USD");
take("BLIZZARD_STORE_CURRENCY_FORMAT_KRW_LONG");
take("BLIZZARD_STORE_CURRENCY_FORMAT_CPT_LONG");
take("BLIZZARD_STORE_CURRENCY_FORMAT_TPT");
take("BLIZZARD_STORE_CURRENCY_FORMAT_GBP");
take("BLIZZARD_STORE_CURRENCY_FORMAT_EURO");
take("BLIZZARD_STORE_CURRENCY_FORMAT_RUB");
take("BLIZZARD_STORE_CURRENCY_FORMAT_MXN");
take("BLIZZARD_STORE_CURRENCY_FORMAT_BRL");
take("BLIZZARD_STORE_CURRENCY_FORMAT_ARS");
take("BLIZZARD_STORE_CURRENCY_FORMAT_CLP");
take("BLIZZARD_STORE_CURRENCY_FORMAT_AUD");
take("BLIZZARD_STORE_CURRENCY_RAW_ASTERISK");
take("BLIZZARD_STORE_CURRENCY_BETA");
take("BLIZZARD_STORE_BROWSE_BATTLE_COINS_KR");
take("BLIZZARD_STORE_BROWSE_BATTLE_COINS_CN");
take("BLIZZARD_STORE_BROWSE_EUR");
take("BLIZZARD_STORE_ASTERISK");
take("BLIZZARD_STORE_INTERNAL_ERROR");
take("BLIZZARD_STORE_INTERNAL_ERROR_SUBTEXT");
take("BLIZZARD_STORE_ERROR_TITLE_OTHER");
take("BLIZZARD_STORE_ERROR_MESSAGE_OTHER");
take("BLIZZARD_STORE_NOT_AVAILABLE");
take("BLIZZARD_STORE_NOT_AVAILABLE_SUBTEXT");
take("BLIZZARD_STORE_ERROR_TITLE_PAYMENT");
take("BLIZZARD_STORE_ERROR_MESSAGE_PAYMENT");
take("BLIZZARD_STORE_ERROR_TITLE_BATTLEPAY_DISABLED");
take("BLIZZARD_STORE_ERROR_MESSAGE_BATTLEPAY_DISABLED");
take("BLIZZARD_STORE_SECOND_CHANCE_KR");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_CN");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_TW");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_USD");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_GBP");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_EUR");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_RUB");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_ARS");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_CLP");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_MXN");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_BRL");
take("BLIZZARD_STORE_LICENSE_ACK_TEXT_AUD");
take("BLIZZARD_STORE_REGION_LOCKED");
take("BLIZZARD_STORE_REGION_LOCKED_SUBTEXT");
take("BLIZZARD_STORE_ERROR_TITLE_INSUFFICIENT_BALANCE");
take("BLIZZARD_STORE_ERROR_MESSAGE_INSUFFICIENT_BALANCE");
take("BLIZZARD_STORE_ERROR_TITLE_ALREADY_OWNED");
take("BLIZZARD_STORE_ERROR_MESSAGE_ALREADY_OWNED");
take("BLIZZARD_STORE_ERROR_TITLE_PARENTAL_CONTROLS");
take("BLIZZARD_STORE_ERROR_MESSAGE_PARENTAL_CONTROLS");
take("BLIZZARD_STORE_ERROR_TITLE_PURCHASE_DENIED");
take("BLIZZARD_STORE_ERROR_MESSAGE_PURCHASE_DENIED");
take("BLIZZARD_STORE_DISCOUNT_TEXT_FORMAT");
take("BLIZZARD_STORE_PAGE_NUMBER");
take("BLIZZARD_STORE_SPLASH_BANNER_DISCOUNT_FORMAT");
take("BLIZZARD_STORE_SPLASH_BANNER_FEATURED");
take("BLIZZARD_STORE_SPLASH_BANNER_NEW");
take("BLIZZARD_STORE_WALLET_INFO");
take("BLIZZARD_STORE_PROCESSING");
take("BLIZZARD_STORE_PURCHASE_SENT");
take("BLIZZARD_STORE_BEING_PROCESSED_CHECK_BACK_LATER");
take("BLIZZARD_STORE_YOU_ALREADY_OWN_THIS");
take("CHARACTER_UPGRADE_LOG_OUT_NOW");
take("CHARACTER_UPGRADE_POPUP_LATER");
take("CHARACTER_UPGRADE_READY");
take("CHARACTER_UPGRADE_READY_DESCRIPTION");
take("FREE_CHARACTER_UPGRADE_READY");
take("FREE_CHARACTER_UPGRADE_READY_DESCRIPTION");


retain("OKAY");
retain("LARGE_NUMBER_SEPERATOR");
retain("DECIMAL_SEPERATOR");
retain("TOOLTIP_DEFAULT_COLOR");
retain("TOOLTIP_DEFAULT_BACKGROUND_COLOR");

take("BLIZZARD_CHALLENGE_SUBMIT");
take("BLIZZARD_CHALLENGE_CANCEL");
take("BLIZZARD_CHALLENGE_CONNECTING");
take("BLIZZARD_CHALLENGE_OKAY");
take("BLIZZARD_CHALLENGE_DENIED_TITLE");
take("BLIZZARD_CHALLENGE_DENIED_DESCRIPTION");
take("BLIZZARD_CHALLENGE_ERROR_TITLE");
take("BLIZZARD_CHALLENGE_ERROR_DESCRIPTION");
take("BLIZZARD_CHALLENGE_SCREEN_EXPLANATION");

--Lua enums
take("LE_STORE_ERROR_INVALID_PAYMENT_METHOD");
take("LE_STORE_ERROR_PAYMENT_FAILED");
take("LE_STORE_ERROR_WRONG_CURRENCY");
take("LE_STORE_ERROR_BATTLEPAY_DISABLED");
take("LE_STORE_ERROR_INSUFFICIENT_BALANCE");
take("LE_STORE_ERROR_OTHER");
take("LE_STORE_ERROR_ALREADY_OWNED");
take("LE_STORE_ERROR_PARENTAL_CONTROLS_NO_PURCHASE");
take("LE_STORE_ERROR_PURCHASE_DENIED");